1

R 参照クラスについて私が本当に気に入らないことが 1 つあります。それは、メソッドを記述する順序が重要であることです。クラスが次のようになるとします。

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"

私は2つのことに興味があります:

  • この煩わしさを回避する方法はありますか?
  • これは、非常に長いクラス ファイルを複数のファイルに分割できないということですか? (たとえば、メソッドごとに 1 つのファイル。)
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 では、あなたのような 1 つの引数を持つメソッドは、定義時に実際には 2 つの引数を持ち、次のようになります。

  def afunc(self, i):
  [code]

しかし、次のように呼ばれます:

  x.afunc(1)

その中に参照する変数afuncがあります(それを呼び出すことは普遍的な慣習ですが、何でも呼び出すことができます)。selfxself

R では、.self参照クラスに散りばめられたちょっとした魔法です。変更したくてもできないと思います.this

于 2014-08-13T07:20:31.700 に答える