特定のS4ジェネリック関数/メソッドに関連付けられているすべてのS4メソッドが、特定のデフォルト値を持つことになっている仮引数を共有しているとします。直感的には、S4ジェネリックの定義でそのような議論を述べます(私には多少冗長に見える各メソッド定義でそれを述べるのとは対照的です)。
ただし、この方法では、仮引数のデフォルト値がメソッドにディスパッチされていないように見え、エラーがスローされるため、問題が発生していることに気付きました。
これは、ジェネリックとメソッドの組み合わせを持つという考えにいくらか反対ではありませんか?デフォルト値が常に同じであるのに、なぜ各メソッドで仮引数を個別に記述しなければならないのですか?どういうわけか、正式な引数のデフォルト値を明示的にディスパッチできますか?
以下に、動作の簡単な図を示します。
ジェネリック関数
setGeneric(
name="testFoo",
signature=c("x", "y"),
def=function(
x,
y,
do.both=FALSE,
...
) {
standardGeneric("testFoo")
}
)
方法
setMethod(
f="testFoo",
signature=signature(x="numeric", y="numeric"),
definition=function(
x,
y
) {
if (do.both) {
out <- list(x=x, y=y)
} else {
out <- x
}
return(out)
}
)
エラー
> testFoo(x=1, y=2)
Error in .local(x, y, ...) : object 'do.both' not found
do.both
それを修正する冗長なステートメント
setMethod(
f="testFoo",
signature=signature(x="numeric", y="numeric"),
definition=function(
x,
y,
do.both=FALSE
) {
if (do.both) {
out <- list(x=x, y=y)
} else {
out <- x
}
return(out)
}
)
> testFoo(x=1, y=2)
[1] 1