1

关于 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"

我对两件事感兴趣:

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

1 回答 1

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是一个通用约定,它可以被称为任何东西)。

在 R 中,.self在引用类上撒了一点魔法。我不认为你可以改变它,.this即使你想要。

于 2014-08-13T07:20:31.700 回答