r – S4中的substitute()

如果在方法中只定义了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]"

但是,如果在方法的定义中添加了额外的命名参数,则replace()将在传递时正确返回参数:

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

关于为什么会发生这种情况的任何线索,最重要的是,它是如何解决的?

最佳答案 看一眼

showMethods(fS4, includeDef=TRUE)

这表现了

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

S4实现具有与泛型不同的签名的方法的方式是通过在具有通用签名的函数内创建具有修改的签名的“.local”函数.替换然后在不正确的环境中评估.潜在的问题与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"

任何在“正确”环境中进行评估的尝试都会受到用户提供的任意构造的阻碍.

点赞