Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.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
R引用类中字段(数据成员)的自动更新_R_Oop_Reference Class - Fatal编程技术网

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

R引用类中字段(数据成员)的自动更新,r,oop,reference-class,R,Oop,Reference Class,python中的decorator@property有什么等价物吗 也就是说,一个字段由于另一个字段的更新而自动更新(在访问时),而不是在访问之前重新计算它 更新2014-02-06 通过将“一个”字段定义为“另一个”字段的activeBindingFunction,打开自动更新功能(参见@jdharison的答案)。但是,是否仍有必要检查此类更新是否是延迟评估?如果没有,我们如何才能做到这一点 (稍后编辑:activeBindingFunction中的一个“非正式”打印函数显然表明评估是惰性的

python中的
decorator@property
有什么等价物吗

也就是说,一个字段由于另一个字段的更新而自动更新(在访问时),而不是在访问之前重新计算它

更新2014-02-06

通过将“一个”字段定义为“另一个”字段的
activeBindingFunction
,打开自动更新功能(参见@jdharison的答案)。但是,是否仍有必要检查此类更新是否是延迟评估?如果没有,我们如何才能做到这一点

(稍后编辑:
activeBindingFunction
中的一个“非正式”打印函数显然表明评估是惰性的。有没有更正式的方法来检查这个问题?)

为了更好地说明我的问题,下面是一段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}

不知道你是不是在追求什么

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 

测试谢谢!使用
activeBindingFunction
类解决了我的大部分问题。我投票支持你。但正如更新的问题中所述,还有一个关于“懒惰评估”的问题。是的,这是显而易见的,尽管是非正式的。但它是有效的!我接受了你的回答。但是,我更希望使用更正式的oop语法来检查这一方面。不知道这是否真的可能。再次感谢!