Как полностью клонировать генератор R6Class
Я разрабатываю пакет R и использую R6 для внутреннего использования. У меня есть два объекта R6:
Foo
объект, который содержит много данных и методы суммирования всех данных;Bar
объект, который содержит методы поднабораFoo
Данные и методы запроса, которые специфические данные.
Что я хочу сделать, это создать клон Bar
R6Class Generator
объект и передать среду, которая содержит все данные Foo
объект. Я не мог найти способ завершить клонирование R6Class Generator
,
ПРИМЕЧАНИЕ: я не хочу напрямую разбивать данные в Foo
и передать эти данные Bar$new
что значительно замедлит весь процесс, так как Bar
объекты будут созданы, а не единственный желаемый.
Ниже приведен простой пример:
library(R6)
Foo <- R6Class(classname = "Foo",
public = list(
initialize = function (x) {
private$m_x <- x
private$m_bar_gen <- private$create_bar_gen(Bar)
},
new_bar = function () {
private$m_bar_gen$new()
}),
private = list(
m_x = NULL,
m_bar_gen = NULL,
create_bar_gen = function (Bar) {
my_bar <- list2env(as.list.environment(Bar), parent = emptyenv())
class(my_bar) <- "R6Generator"
my_bar$self <- my_bar
my_bar$set("private", "m_x", private$m_x, overwrite = TRUE)
my_bar
}
)
)
Bar <- R6Class(classname = "Bar",
public = list(
initialize = function () {
stopifnot(!is.null(private$m_x))
private$m_x
}
),
private = list(
m_x = NULL
)
)
Это остановится как private$m_x
не определено
Bar$new()
#> Error: !is.null(private$m_x) is not TRUE
После Foo
объект инициализирован,
(foo_1 <- Foo$new(1))
#> <Foo>
#> Public:
#> clone: function (deep = FALSE)
#> initialize: function (x)
#> new_bar: function ()
#> Private:
#> create_bar_gen: function (Bar)
#> m_bar_gen: R6Generator
#> m_x: 1
это будет работать
foo_1$new_bar()
#> <Bar>
#> Public:
#> clone: function (deep = FALSE)
#> initialize: function ()
#> Private:
#> m_x: 1
но оригинал Bar
R6Class Generator также был изменен
Bar$private_fields$m_x
#> [1] 1
Кажется, что private$create_bar_gen()
не удалось завершить копирование генератора R6Class. my_bar$set
будет как оригинал, так и новый.
(foo_2 <- Foo$new(2))
#> <Foo>
#> Public:
#> clone: function (deep = FALSE)
#> initialize: function (x)
#> new_bar: function ()
#> Private:
#> create_bar_gen: function (Bar)
#> m_bar_gen: R6Generator
#> m_x: 2
foo_2$new_bar()
#> <Bar>
#> Public:
#> clone: function (deep = FALSE)
#> initialize: function ()
#> Private:
#> m_x: 2
Bar$private_fields$m_x
#> [1] 2
foo_1$new_bar()
#> <Bar>
#> Public:
#> clone: function (deep = FALSE)
#> initialize: function ()
#> Private:
#> m_x: 2