Переменные класса с R6

Мне было любопытно, если бы был способ создать переменные класса для классов R6 в рамках определения класса? Я прочитал виньетку " Введение в классы R6", но не нашел упоминания о переменных класса. Я могу создать переменные класса после создания класса с помощью ClassName$variableName <- initial_value но было бы любопытно, если бы был способ сделать это в рамках фактического определения класса.

В качестве примера рассмотрим Person класс ниже, который имеет переменную класса count который отслеживает количество Person объекты, которые были созданы:

library(R6)

Person <- R6Class("Person",
  public = list(
    name = NA,

    initialize = function(name) {
      Person$count <- Person$count + 1
      if (!missing(name)) self$name <- name
    }
  )
)

Person$count <- 0

Person$count # 0
john <- Person$new("John")
Person$count # 1
james <- Person$new("James")
Person$count # 2

1 ответ

Не совсем то, что вы просили, но это может помочь. Вы можете добавить в класс среду для хранения переменных, которые являются общими для всех экземпляров класса. Из-за эталонной семантики сред эта среда не сбрасывается при каждом новом Person Экземпляр создан.

Вот пример

library(R6)

Person = R6Class(
  "Person",
  public = list(
    name = NA,
    initialize = function( name ){
      if (!missing(name)) self$name <- name
      counter = self$getCounter()
      private$shared_env$counter = counter + 1
    },
    getCounter = function(){
      counter = private$shared_env$counter
      if( is.null( counter ) )
        counter =  0
      return( counter )
    }
  ),
  private = list(
    shared_env = new.env()
  )
)

Тестирование кода

john <- Person$new("John")
john$getCounter()
# 1
james <- Person$new("James")
james$getCounter()
# 2
john$getCounter()
# 2

Вы можете объединить этот метод с активными привязками, чтобы сделать такие вещи, как john$counterи т. д. также работают. Если вы хотите уменьшить счетчик при уничтожении объекта, используйте finalize метод в R6,

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