【问题标题】:Can you use fix via do.call?你可以通过 do.call 使用 fix 吗?
【发布时间】:2010-10-06 15:50:29
【问题描述】:

我有一些代码,通过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

【问题讨论】:

    标签: r do.call


    【解决方案1】:

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

    【讨论】:

    • 我发现在我使用substitute 的任何场合之前,通常都会有一段延长的编程诱发的抽动症。如果有人知道如何以及何时使用它的简单说明,我将不胜感激。
    • @hadley:感谢您的链接;比R语言手册要清楚得多。
    • 你最好用identical()测试相等性
    • 我认为在这里使用as.name 更好,因为替代品做了很多不同的事情,所以很难弄清楚发生了什么。但我现在真的很喜欢你的解释。
    【解决方案2】:

    第一个错误给你一个提示。这有效:

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

    即使您使用dfr="dfr",第二次尝试仍然会遇到同样的错误,因为命名列表需要what(函数)的参数名称。所以你的第二次尝试应该是:

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

    【讨论】:

    • @Richie:也试试 James 的回答,因为它更像 R。
    • @Joshua:将 James 标记为官方答案,因为它也解决了 edit 问题,但请提醒我,我欠你一个额外的支持,因为它出色的快速响应。
    • @Richie:不用担心;这是更好的答案。
    • 不,这是更好的答案,因为它正确解释了fix 的输入。
    • @hadley fix 接受名称或字符串的输入,因此肯定两个答案都正确解释了输入
    猜你喜欢
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多