Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用R6类变量_R_R6 - Fatal编程技术网

使用R6类变量

使用R6类变量,r,r6,R,R6,我很好奇是否有办法在类的定义中为R6类创建类变量?我通读了小插曲,但没有发现任何关于类变量的内容。在使用ClassName$variableName创建类之后,我能够创建类变量,这与您的要求不完全一样,但这可能会有所帮助。您可以将环境添加到类中,以存储在类的所有实例之间共享的变量。由于环境的引用语义,每当创建新的Person实例时,不会重置此环境 这里有一个例子 library(R6) Person = R6Class( "Person", public = list( nam

我很好奇是否有办法在类的定义中为R6类创建类变量?我通读了小插曲,但没有发现任何关于类变量的内容。在使用
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