3

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总是将其答案转储到全局环境中,这对于测试示例来说很好,但对于函数的使用不太好。Joshua 出色的解决方法并没有扩展到与edit.

对于奖励积分,您如何拨打edit电话do.call

4

2 回答 2

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这些表达式包装起来,您会看到第一个示例给出了您遇到的相同错误,而第二个示例按预期工作。

阅读哈德利的链接后,正在评估的内容变得更加清晰:

> as.name("dfr")==substitute(dfr)
[1] TRUE
于 2010-10-06T16:06:39.440 回答
3

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

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

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

do.call(fix,list(x="dfr"))
于 2010-10-06T15:54:52.150 回答