我有一些代码,在这些代码中,通过do.call调用fix比直接调用更方便。任何旧的数据框都适用于此示例:
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。
对于奖励积分,如何通过do.call调用edit
发布于 2010-10-07 00:06:39
您可以使用substitute,当您想要使用变量名作为标签时,它也很有用。
do.call("fix",list(substitute(dfr)))用于clarity的编辑
使用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发布于 2010-10-06 23:54:52
第一个错误给您一个提示。这是可行的:
do.call(fix,list("dfr"))因为命名列表需要what (函数)的参数名称,所以即使您使用dfr="dfr",在第二次尝试时仍然会得到相同的错误。所以你的第二次尝试应该是:
do.call(fix,list(x="dfr"))https://stackoverflow.com/questions/3874376
复制相似问题