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

Ric*_*ton 3 r do.call

我有一些代码,它是更方便的调用fix通过do.call,而不是直接.任何旧数据框都适用于此示例:

dfr <- data.frame(x = 1:5, y = letters[1:5])
Run Code Online (Sandbox Code Playgroud)

显而易见的第一次尝试是

do.call("fix", list(dfr))
Run Code Online (Sandbox Code Playgroud)

不幸的是,这失败了

Error in fix(list(x = 1:5, y = 1:5)) : 'fix' requires a name
Run Code Online (Sandbox Code Playgroud)

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

do.call("fix", list(dfr = dfr))
Run Code Online (Sandbox Code Playgroud)

这次失败了

Error in is.name(subx) : 'subx' is missing
Run Code Online (Sandbox Code Playgroud)

为了记录,edit也不起作用.

dfr <- do.call("edit", list(dfr = dfr))
Run Code Online (Sandbox Code Playgroud)

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

编辑:经过反思,我忘记了fix总是把它的答案转移到全局环境中,这对于测试示例来说很好,但对于使用函数却不太好.约书亚的优秀解决方法并没有延伸到使用edit.

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

Jam*_*mes 7

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

do.call("fix",list(substitute(dfr)))
Run Code Online (Sandbox Code Playgroud)

编辑清晰

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

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

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

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

> as.name("dfr")==substitute(dfr)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)