R:更改类的字段'(slots')值,将值分配给其他字段

时间:2012-07-05 21:58:22

标签: r reference-class

为一个字段分配值,如何更改其他字段。

考虑以下ReferenceClass对象:

C<-setRefClass("C", 
      fields=list(a="numeric",b="numeric")
      , methods=list(
      seta = function(x){
      a<<-x
      b<<-x+10
      cat("The change took place!")
      }
      ) # end of the methods list
      ) # end of the class

现在创建类的实例

c<-C$new() 

此命令

c$seta(10)

将导致c $ a为10且c $ b为20.

所以它确实有效,但是,我希望通过命令实现这个结果

c$a<-10

(即之后我希望c $ b等于在seta()函数逻辑中的类中定义的20)
我该怎么办?

1 个答案:

答案 0 :(得分:3)

我认为您正在寻找访问者功能,这些功能在?ReferenceClasses中有详细介绍。这应该有效:

C<-setRefClass("C", 
    fields=list(
        a=function(v) {
              if (missing(v)) return(x)
              assign('x',v,.self)                    
              b<<-v+10
              cat ('The change took place!')
            }
       ,b="numeric"
    )
    ,methods=list(
        initialize=function(...)  {
             assign('x',numeric(),.self)
            .self$initFields(...)
        } 
    )
)

c<-C$new()
c$a
# numeric(0)
c$a<-3
# The change took place!
c$b
# 13
c$a
# 3

它确实有副作用,即新值x现在位于环境c(类对象)中,但它只是在打印的意义上从用户“隐藏” c不会将x列为字段。