Переменные класса с 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
,