R引用类和多个文件中的方法顺序

时间:2014-08-13 07:10:57

标签: r oop reference-class

我真的不喜欢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"

我对两件事感兴趣:

  • 有办法解决这个麻烦吗?
  • 这是否意味着我永远不能将一个非常长的类文件拆分成多个文件? (例如,每种方法都有一个文件。)

1 个答案:

答案 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