题
我有一些代码,更方便地致电 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
?
解决方案
您可以使用 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
其他提示
第一个错误为您提供了提示。这起作用:
do.call(fix,list("dfr"))
即使使用 dfr="dfr"
因为命名的列表需要参数的名称 what
(功能)。因此,您的第二次尝试应该是:
do.call(fix,list(x="dfr"))
不隶属于 StackOverflow