使用R6类变量
我很好奇是否有办法在类的定义中为R6类创建类变量?我通读了小插曲,但没有发现任何关于类变量的内容。在使用使用R6类变量,r,r6,R,R6,我很好奇是否有办法在类的定义中为R6类创建类变量?我通读了小插曲,但没有发现任何关于类变量的内容。在使用ClassName$variableName创建类之后,我能够创建类变量,这与您的要求不完全一样,但这可能会有所帮助。您可以将环境添加到类中,以存储在类的所有实例之间共享的变量。由于环境的引用语义,每当创建新的Person实例时,不会重置此环境 这里有一个例子 library(R6) Person = R6Class( "Person", public = list( nam
ClassName$variableName创建类之后,我能够创建类变量,这与您的要求不完全一样,但这可能会有所帮助。您可以将环境添加到类中,以存储在类的所有实例之间共享的变量。由于环境的引用语义,每当创建新的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()
)
)
库(R6)
个人=R6Class(
“人”,
公共=列表(
name=NA,
初始化=函数(名称){
如果(!missing(name))self$name,它看起来像下面的文档在“包含引用对象的字段”中讨论的内容。我是否可以避免使用private
?@user1700890是。没有必要将shared_env
定义为私有字段。但是,如果将字段设置为公共字段,则计数器可以被客户端代码覆盖。关于链接:是的,这正是此解决方案中使用的机制。通常,您希望初始化引用对象initialize()
中的对象,但如果不这样做,则允许兄弟姐妹之间的“共享内存”。
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