R6Class - проблема инкапсуляции: плохой дизайн? - PullRequest
0 голосов
/ 07 марта 2020

Минимальный пример

Присоединение пакета R6

require(R6)

Определение класса элемента

element_factory <- R6Class(
  "Element",
  private = list(
    ..value = 0),
  active = list(
    value = function(new) {
      if(missing(new))
        private$..value
      else private$..value <- new}))

Определение класса контейнера

container_factory <- R6Class(
  "Container",
  private = list(
    ..element = element_factory$new()
  ),
  active = list(
    element = function() private$..element))

Создание контейнера istance

co <- container_factory$new()

Доступ к элементу и полю элемента

> co$element

<Element>
   Public:
   clone: function (deep = FALSE)
     initialize: function (value = 0)
       value: active binding
Private:
  ..value: 0

> co$element$value

[1] 0

Изменение поля значения в объекте элемента

Выдает ошибку
> co$element$value <- 3

Error in (function ()  : unused argument (base::quote(<environment>))
Но значение изменяется
> co$element

<Element>
   Public:
   clone: function (deep = FALSE)
     initialize: function (value = 0)
       value: active binding
Private:
  ..value: 3

Вопрос

Что означает эта ошибка и как ее предотвратить?


РЕДАКТИРОВАТЬ:

Я нашел обходной путь, но все еще не понимаю исходную ошибку:

elt <- co$element
elt$value <- 3

Это работает и не выдает ошибку.

Я также удивлен, что следующий код выдает еще одну ошибку:

(co$element)$value <- 3

Error in (co$element)$value <- 3 : could not find function "(<-"
...