Как полностью клонировать генератор R6Class

Я разрабатываю пакет R и использую R6 для внутреннего использования. У меня есть два объекта R6:

  1. Foo объект, который содержит много данных и методы суммирования всех данных;
  2. Bar объект, который содержит методы поднабора FooДанные и методы запроса, которые специфические данные.

Что я хочу сделать, это создать клон BarR6Class 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

0 ответов

Другие вопросы по тегам