5

我很好奇是否有办法在类的定义中为 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
4

1 回答 1

4

不完全是您所要求的,但这可能会有所帮助。您可以向类添加环境以存储在类的所有实例之间共享的变量。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.

于 2017-06-20T02:04:20.550 回答