如何完全克隆R6Class生成器

如何完全克隆R6Class生成器,r,r6,R,R6,我正在开发一个R包,并在内部使用R6。我有两个R6对象: 一个Foo对象,包含大量数据和汇总整个数据的方法 一种Bar对象,其中包含Foo数据的子集方法和查询特定子集数据的方法 我想做的是创建一个BarR6Class生成器对象的克隆,并传递一个包含Foo对象所有数据的环境。我找不到完成克隆R6Class生成器的方法 注意:我不想直接分割Foo中的数据并将该数据传递给Bar$new,这将大大降低整个过程的速度,因为将创建大量Bar对象,而不是只创建所需的对象 下面是一个简单的例子: library

我正在开发一个R包,并在内部使用R6。我有两个R6对象:

  • 一个
    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