R 你能通过do.call使用fix吗?

R 你能通过do.call使用fix吗?,r,do.call,R,Do.call,我有一些代码,通过do.call调用fix比直接调用更方便。任何旧数据框都适用于此示例: dfr <- data.frame(x = 1:5, y = letters[1:5]) 不幸的是,这种方法失败了 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) : '

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

dfr <- data.frame(x = 1:5, y = letters[1:5])
不幸的是,这种方法失败了

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))

dfr第一个错误给出了一个提示。这项工作:

do.call(fix,list("dfr"))
即使使用了
dfr=“dfr”
,您在第二次尝试时仍然会遇到相同的错误,因为命名列表需要
what
(函数)的参数名称。因此,您的第二次尝试应该是:

do.call(fix,list(x="dfr"))

您可以使用
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

@里奇:也试试詹姆斯的答案,因为它更像R。@Joshua:将詹姆斯作为官方答案,因为它也解决了
编辑问题,但提醒我,我欠你一张额外的选票,让你快速做出出色的反应。@Richie:不用担心;这是一个更好的答案。不,这是一个更好的答案,因为它正确地解释了
fix
@hadley
fix
的输入,它接受一个名称或字符串,因此,这两个答案肯定都正确地解释了输入。我发现,在我使用
替代
的任何情况下,通常都会先进行一次由编程引起的长时间的tourette。如果有人知道如何以及何时使用它的简单解释,我将不胜感激。@hadley:谢谢你的链接;它比R语言手册清楚得多。你最好使用
idential()
测试等式,我认为最好在这里使用
as.name
,因为replacement做了很多不同的事情,所以很难弄清楚到底发生了什么。但我现在真的很喜欢你的解释。
> as.name("dfr")==substitute(dfr)
[1] TRUE