首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你能通过do.call使用fix吗?

你能通过do.call使用fix吗?
EN

Stack Overflow用户
提问于 2010-10-06 23:50:29
回答 2查看 268关注 0票数 3

我有一些代码,在这些代码中,通过do.call调用fix比直接调用更方便。任何旧的数据框都适用于此示例:

代码语言:javascript
复制
dfr <- data.frame(x = 1:5, y = letters[1:5])

显而易见的第一个尝试是

代码语言:javascript
复制
do.call("fix", list(dfr))

不幸的是,这样做失败了

代码语言:javascript
复制
Error in fix(list(x = 1:5, y = 1:5)) : 'fix' requires a name

所以,我们给它起一个名字:

代码语言:javascript
复制
do.call("fix", list(dfr = dfr))

这一次它失败了,出现了

代码语言:javascript
复制
Error in is.name(subx) : 'subx' is missing

根据记录,edit也不起作用。

代码语言:javascript
复制
dfr <- do.call("edit", list(dfr = dfr))

有没有人能想出一个合理的变通办法?

编辑:经过反思,我忘记了fix总是将其答案转储到全局环境中,这对于测试示例来说很好,但对于函数使用就不是那么好了。Joshua出色的解决方案不能扩展到edit

对于奖励积分,如何通过do.call调用edit

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-07 00:06:39

您可以使用substitute,当您想要使用变量名作为标签时,它也很有用。

代码语言:javascript
复制
do.call("fix",list(substitute(dfr)))

用于clarity的编辑

使用call命令可以更容易地看到这是如何工作的:

代码语言:javascript
复制
> call("fix",dfr)
fix(list(x = c(1, 2, 3, 4, 5), y = 1:5))
> call("fix",substitute(dfr))
fix(dfr)

因此,当您使用substitute时,正在创建的命令使用符号的名称,而不是计算出的符号。如果您将这些表达式包装成eval,您会看到第一个示例给出了与您遇到的相同的错误,而第二个示例则按预期工作。

在阅读hadley的链接后,它变得更加清晰,正在评估什么:

代码语言:javascript
复制
> as.name("dfr")==substitute(dfr)
[1] TRUE
票数 7
EN

Stack Overflow用户

发布于 2010-10-06 23:54:52

第一个错误给您一个提示。这是可行的:

代码语言:javascript
复制
do.call(fix,list("dfr"))

因为命名列表需要what (函数)的参数名称,所以即使您使用dfr="dfr",在第二次尝试时仍然会得到相同的错误。所以你的第二次尝试应该是:

代码语言:javascript
复制
do.call(fix,list(x="dfr"))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3874376

复制
相关文章

相似问题

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