R6: добавить функцию в основной класс - PullRequest
0 голосов
/ 22 октября 2018

Мне нравится функция set в R6, так как она позволяет мне строить объект более динамично.Я хочу иметь возможность начать с пустого объекта настроек в R6Class()$private$settings, а затем динамически добавлять его, когда у меня появляются новые объекты и тесты.

set переопределяет объект, я хотел бы добавить его или добавить новую функцию, чтобы вместо этого обновить функцию перед вызовом R6Class(..)$new.Это возможно, или я должен подходить к этому по-другому?Я получаю сообщение об ошибке Error in element %in% names(self$private) : object 'self' not found, поэтому я предполагаю, что это как-то связано со средой?

library(R6)
# build R6 template
templateSettings <- R6::R6Class(classname = "Template",
                                lock_objects = FALSE)

# updating an object in the R6Class, specifically a settings list in $private
newSetting <- function(element = NULL, name, value){
  stopifnot(element %in% names(self$private))
  stopifnot(!name %in% names(self$private[[element]]))

  object <- list(value)
  names(object) <- name
  self$private[[element]] <- c(self$private[[element]], object)
  invisible()
}

# create a settings list to try and update
templateSettings$set("private", "settings", list())

# try to assign in to templateSetting, assigns, but environment doesn't match
# templateSettings$set
assign("newSetting", newSetting, envir = environment(templateSettings$set))
templateSettings$newSetting

# dynamically update a settings object private$settings to be 
# list(a=1, b=2). "Error in element %in% names(self$private) : object 'self' not found"
templateSettings$newSetting("settings", "a", 1)
templateSettings$newSetting("settings", "b", 2)

Приветствия, Джонни

...