我真的不喜欢R引用类:你编写方法的顺序很重要。假设你的课程是这样的:
myclass = setRefClass("myclass",
fields = list(
x = "numeric",
y = "numeric"
))
myclass$methods(
afunc = function(i) {
message("In afunc, I just call bfunc...")
bfunc(i)
}
)
myclass$methods(
bfunc = function(i) {
message("In bfunc, I just call cfunc...")
cfunc(i)
}
)
myclass$methods(
cfunc = function(i) {
message("In cfunc, I print out the sum of i, x and y...")
message(paste("i + x + y = ", i+x+y))
}
)
myclass$methods(
initialize = function(x, y) {
x <<- x
y <<- y
}
)
然后你启动一个实例,并调用一个方法:
x = myclass(5, 6)
x$afunc(1)
您将收到错误消息:
Error in x$afunc(1) : could not find function "bfunc"
我对两件事感兴趣:
答案 0 :(得分:3)
调用bfunc(i)
不会调用该方法,因为它不知道它正在操作什么对象!
在方法定义中,.self
是在(?)上方法的对象。所以将代码更改为:
myclass$methods(
afunc = function(i) {
message("In afunc, I just call bfunc...")
.self$bfunc(i)
}
)
(同样适用于bfunc
)。您是来自C ++还是某种语言,其中方法中的函数会在对象的上下文中自动调用?
有些语言使这一点更加明确,例如在Python中,一个像你这样的参数的方法在定义时实际上有两个参数,并且会是:
def afunc(self, i):
[code]
但是称之为:
x.afunc(1)
然后在afunc
内有self
变量引用x
(尽管调用它self
是一个普遍的约定,它可以被称为任何东西)。< / p>
在R中,.self
在参考类上有点神奇。即使你想要,我认为你也不能将它改为.this
。