我有一些代码,通过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}}?
答案 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"))