私の質問:
callNextMethod()
次のメソッドに期待どおりに引数を渡さないのはなぜですか?
状況:
2つの階層クラスがfoo
あり、bar
(bar
のサブクラスはfoo
)foobar
両方のクラスにディスパッチできるメソッドがある(つまり、両方のクラスのメソッドがある)とします。
さらに、(サブ)クラスのメソッドは、を使用していくつかの計算を行った後bar
、のメソッドを呼び出します。foo
callNextMethod()
どちらのメソッドにも同じ追加の引数(デフォルト)があり、これはのメソッドに渡される必要がfoo
あります。ここで、それだけが関係します。
setClass("foo", representation(x = "numeric"))
setClass("bar", contains = "foo")
setGeneric("foobar", function(object, ...) standardGeneric("foobar"))
setMethod("foobar", "foo", function(object, another.argument = FALSE, ...) {
print(paste("in foo-method:", another.argument))
if (another.argument) object@x^3
else object@x^2
})
setMethod("foobar", "bar", function(object, another.argument = FALSE, ...) {
print(paste("in bar-method:", another.argument))
object@x <- sqrt(object@x)
callNextMethod()
})
問題
の説明:引数は期待どおりに渡されませんが、デフォルト値はメソッド定義から取得されます。具体的には、最初のメソッドでは、引数は呼び出し(TRUE
)で指定されたとおりですが、次のメソッドではに変更さFALSE
れます。
o1 <- new("bar", x = 4)
foobar(o1, another.argument = TRUE)
与える
[1] "in bar-method: TRUE"
[1] "in foo-method: FALSE"
[1] 4
another.argument
次のメソッドに渡して、メソッドTRUE
の呼び出しにも含まれるようにしますfoo
。
期待どおり?callNextMethod
に機能するはずです(つまり、名前付き引数は呼び出しの場合と同じように渡されます)。
元の呼び出しに表示される仮引数、たとえばxの場合、次のメソッド呼び出しにはx=xに相当する対応する引数があります。実際、これは、次のメソッドが同じ実際の引数を参照するが、引数は1回だけ評価されることを意味します。
2番目の質問:another.argumentを次のメソッドに渡すにはどうすればよいですか。(私は本当に両方のメソッドでデフォルトの引数を保持したいと思います)