我有一些代码,它是更方便的调用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?
您可以使用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)