如果只在方法中定义了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"
关于为什么会发生这种情况的任何线索,最重要的是,它是如何解决的?
答案 0 :(得分:2)
看看
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"
任何在“正确”环境中进行评估的尝试都会受到用户提供的任意构造的阻碍。