我有一些代码,更方便地致电 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"))
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top