你可以通过do.call使用fix吗?

时间:2010-10-06 15:50:29

标签: r do.call

我有一些代码,通过fix调用do.call更方便,而不是直接调用dfr <- data.frame(x = 1:5, y = letters[1:5]) 。任何旧数据框都适用于此示例:

do.call("fix", list(dfr))

明显的第一次尝试是

Error in fix(list(x = 1:5, y = 1:5)) : 'fix' requires a name

不幸的是,这失败了

do.call("fix", list(dfr = dfr))

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

Error in is.name(subx) : 'subx' is missing

这次失败了

edit

对于记录,dfr <- do.call("edit", list(dfr = dfr)) 也不起作用。

fix

请问有人能想出明智的解决方法吗?

编辑:经过反思,我忘记了edit总是将其答案转移到全局环境中,这对于测试示例来说很好,但对于函数使用却不太好。约书亚的优秀解决方法并未扩展到与edit一起使用。

对于奖励积分,您如何通过do.call致电{{1}}?

2 个答案:

答案 0 :(得分:7)

您可以使用substitute,这对于您希望将变量名称用作标签时也很有用。

do.call("fix",list(substitute(dfr)))

为了清晰起见而编辑

使用call命令更容易看出它是如何工作的:

> call("fix",dfr)
fix(list(x = c(1, 2, 3, 4, 5), y = 1:5))
> call("fix",substitute(dfr))
fix(dfr)

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

在阅读了hadley的链接之后,评估的内容变得更加清晰:

> as.name("dfr")==substitute(dfr)
[1] TRUE

答案 1 :(得分:3)

第一个错误会给你一个提示。这有效:

do.call(fix,list("dfr"))

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

do.call(fix,list(x="dfr"))