我很好奇是否有办法在类的定义中为 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
Run Code Online (Sandbox Code Playgroud)
不完全是您所要求的,但这可能会有所帮助。您可以向类添加环境来存储在类的所有实例之间共享的变量。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()
)
)
Run Code Online (Sandbox Code Playgroud)
测试代码
john <- Person$new("John")
john$getCounter()
# 1
james <- Person$new("James")
james$getCounter()
# 2
john$getCounter()
# 2
Run Code Online (Sandbox Code Playgroud)
您可以将此方法与活动绑定结合起来,以使john$counter等功能也能正常工作。如果您想在对象被销毁时减少计数器,请使用finalize中的方法R6。