如何完全克隆R6Class生成器
我正在开发一个R包,并在内部使用R6。我有两个R6对象:如何完全克隆R6Class生成器,r,r6,R,R6,我正在开发一个R包,并在内部使用R6。我有两个R6对象: 一个Foo对象,包含大量数据和汇总整个数据的方法 一种Bar对象,其中包含Foo数据的子集方法和查询特定子集数据的方法 我想做的是创建一个BarR6Class生成器对象的克隆,并传递一个包含Foo对象所有数据的环境。我找不到完成克隆R6Class生成器的方法 注意:我不想直接分割Foo中的数据并将该数据传递给Bar$new,这将大大降低整个过程的速度,因为将创建大量Bar对象,而不是只创建所需的对象 下面是一个简单的例子: library
Foo
对象,包含大量数据和汇总整个数据的方法李>
Bar
对象,其中包含Foo
数据的子集方法和查询特定子集数据的方法Bar
R6Class生成器
对象的克隆,并传递一个包含Foo
对象所有数据的环境。我找不到完成克隆R6Class生成器的方法
注意:我不想直接分割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
)
)
初始化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
似乎private$create\u bar\u 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
(foo_2
#>公众:
#>克隆:函数(deep=FALSE)
#>初始化:函数(x)
#>新工具栏:函数()
#>私人:
#>创建条形图生成:函数(条形图)
#>m_bar_gen:R6发电机
#>m_x:2
foo_2$new_bar()
#>
#>公众:
#>克隆:函数(deep=FALSE)
#>初始化:函数()
#>私人:
#>m_x:2
酒吧$private_字段$m_x
#> [1] 2
foo_1$new_bar()
#>
#>公众:
#>克隆:函数(deep=FALSE)
#>初始化:函数()
#>私人:
#>m_x:2
foo_1$new_bar()
#> <Bar>
#> Public:
#> clone: function (deep = FALSE)
#> initialize: function ()
#> Private:
#> m_x: 1
Bar$private_fields$m_x
#> [1] 1
(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