首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >S4中的替换()

S4中的替换()
EN

Stack Overflow用户
提问于 2012-11-23 01:39:28
回答 1查看 136关注 0票数 4

如果在方法中仅定义了S4泛型函数的命名参数,则substitute()将按预期工作:

代码语言:javascript
复制
> setGeneric("fS4", function(x, ...) standardGeneric("fS4"))
> setMethod("fS4", signature("numeric"),
+     function(x, ...) deparse(substitute(x))
+ )
[1] "fS4"
> fS4(iris[,1])
[1] "iris[, 1]"

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

代码语言:javascript
复制
> setMethod("fS4", signature("numeric"),
+     function(x, y, ...) deparse(substitute(x))
+ )
[1] "fS4"
> fS4(iris[,1])
[1] "x"

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-23 02:55:54

看一看

代码语言:javascript
复制
showMethods(fS4, includeDef=TRUE)

它显示了

代码语言:javascript
复制
Function: fS4 (package .GlobalEnv)
x="numeric"
function (x, ...) 
{
    .local <- function (x, y, ...) 
    deparse(substitute(x))
    .local(x, ...)
}

S4使用不同于泛型的签名实现方法的方式是,在具有泛型签名的函数内,创建一个具有修改后的签名的“.local”函数。然后,substitute会在不正确的环境中进行计算。根本问题与S4无关

代码语言:javascript
复制
> 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"

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13517720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档