4

S4 ジェネリック関数の名前付き引数のみがメソッドで定義されている場合、substitute()期待どおりに動作します。

> setGeneric("fS4", function(x, ...) standardGeneric("fS4"))
> setMethod("fS4", signature("numeric"),
+     function(x, ...) deparse(substitute(x))
+ )
[1] "fS4"
> fS4(iris[,1])
[1] "iris[, 1]"

ただし、メソッドの定義に追加の名前付き引数を追加すると、substitute()渡された引数が正しく返されなくなります。

> setMethod("fS4", signature("numeric"),
+     function(x, y, ...) deparse(substitute(x))
+ )
[1] "fS4"
> fS4(iris[,1])
[1] "x"

なぜこれが起こるのか、そして最も重要なこととして、それをどのように回避できるのかについての手がかりはありますか?

4

1 に答える 1

3

を見てみましょう

showMethods(fS4, includeDef=TRUE)

示す

Function: fS4 (package .GlobalEnv)
x="numeric"
function (x, ...) 
{
    .local <- function (x, y, ...) 
    deparse(substitute(x))
    .local(x, ...)
}

S4 がジェネリックとは異なるシグネチャを持つメソッドを実装する方法は、ジェネリック シグネチャを持つ関数内に、変更されたシグネチャを持つ「.local」関数を作成することです。substituteその後、不適切な環境で評価されます。根本的な問題は S4 とは関係ありません

> f = function(x) deparse(substitute(x))
> g = function(y) f(y)
> f(1)
[1] "1"
> g(1)
[1] "y"
> h = function(...) f(...)
> h(1)
[1] "1"

また、「正しい」環境で評価しようとすると、ユーザーが提供する任意の構成要素によって妨害されます。

于 2012-11-22T18:55:54.380 に答える