自动更新R引用类中的字段(数据成员)

时间:2014-02-05 20:08:53

标签: r oop reference-class

任何等价于python中的decorator @property

由于更新了另一个字段,因此有一个字段会自动更新(访问时),而不是在访问之前重新计算它。

更新2014-02-06

通过将“一个”字段定义为“另一个”字段的activeBindingFunction来启用自动更新(请参阅@ jdharrison的回答)。但是,无论如何都要检查这些更新是否是懒惰的评估?如果没有,我们怎样才能做到这一点?

(后来的编辑:activeBindingFunction内部的“非正式”打印功能很明显评估是懒惰的。有什么办法以更正式的方式检查这个问题?)< / p>

为了更好地说明我的问题,下面是一段python代码,通过decorator @property产生所需的懒惰行为 - 请耐心地将其置于 R 标签的问题中。

class Test(object):
    def __init__(self):
        self._num1=None
        self._num2=None

    @property
    def num1(self):
        if (self._num1 is None):
            self._num1=1
            return(self.num1)
        else:
            return(self._num1)

    @num1.setter
    def num1(self, value):
        self._num1 = value

    @property
    def num2(self):
        self._num2=self._num1*2
        return(self._num2)

互动环节

In [2]: obj=Test()

In [3]: obj.__dict__
Out[3]: {'_num1': None, '_num2': None}

In [4]: obj.num1
Out[4]: 1

In [5]: obj.__dict__
Out[5]: {'_num1': 1, '_num2': None}

In [6]: obj.num2
Out[6]: 2

In [7]: obj.__dict__
Out[7]: {'_num1': 1, '_num2': 2}

In [8]: obj.num1 = 5

In [9]: obj.__dict__
Out[9]: {'_num1': 5, '_num2': 2}

In [10]: obj.num2
Out[10]: 10

In [11]: obj.__dict__
Out[11]: {'_num1': 5, '_num2': 10}

1 个答案:

答案 0 :(得分:1)

不知道你的目标是否是

test <- setRefClass("test",
                            fields   = list(
                                            num1 = "numeric"
                                            , num2 = function(){
                                                                print("hello")
                                                                 2*.self$num1
                                                                }
                                           ),
                            methods  = list(
                              initialize = function(num1 = 1){
                                num1 <<- num1
                              },

                              show = function(){
                                print(c(num1 = num1, num2 = num2))
                              }
                            )
)

> tt <- test()
> tt
[1] "hello;"
num1 num2 
   1    2 
> tt$num1<-4
> tt
[1] "hello;"
num1 num2 
   4    8