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 回答