【问题标题】:How to expand an ellipsis (...) argument without evaluating it in R如何在 R 中扩展省略号 (...) 参数而不对其进行评估
【发布时间】:2012-11-01 11:23:48
【问题描述】:

我需要一个函数,它接受任意数量的参数,并将它们作为表达式存储在一个变量中而不计算它们。我设法用match.call 做到了,但它似乎有点“笨拙”。

foo <- function(...) {
  expr <- match.call()
  expr[[1]] <- expression
  expr <- eval(expr)
  # do some stuff with expr
  return(expr)
}

> bla
Error: object 'bla' not found
> foo(x=bla, y=2)
expression(x = bla, y = 2)

澄清

为了澄清,我在问如何编写一个行为类似于expression() 的函数。我不能直接使用expression(),原因太长无法解释。

【问题讨论】:

  • 现在看来foo &lt;- expression 会这样做,不是吗? “# do some stuff with expr”是什么意思?
  • 刚刚发布了我的答案并意识到您的评论是一种更简单的方法
  • 看看plyr 中的. 函数,它可能会做你想做的事,或者至少为你指明正确的方向
  • 您实际上不太可能需要一个表达式对象 - 调用列表通常就足够了。

标签: r lazy-evaluation ellipsis


【解决方案1】:

最惯用的方式是:

f <- function(x, y, ...) {
  match.call(expand.dots = FALSE)$`...`
}

【讨论】:

  • +1 确实是惯用的 - 它在基础 R 中被广泛使用,例如在通过lm() 中的公式指定的线性模型的代码中。
【解决方案2】:

最终的预期结果有点模糊(你能澄清一下吗?)。但是,这可能会有所帮助:

foo2 <- function(...) {
  expr <- as.list(substitute(list(...)))[-1L]
  class(expr) <- "expression"
  expr
}

示例:

foo2(x=bla, y=2)
# expression(x = bla, y = 2)

【讨论】:

  • 很高兴为您提供帮助。如果合适,请随意给它打勾
  • 我给你打勾,虽然我可能会使用@mnel 的解决方案,因为它有点干净
  • @ErnestA 那么你应该在另一个答案上打勾! :) 目前尚不清楚您使用它的具体程度。如果您将使用match.call(),请查看expand.dots 的文档,因为您可能需要将其设置为FALSE
【解决方案3】:

使用来自plyr. 作为原型

foo <-   function (...) 
  {
  as.expression(as.list(match.call()[-1]))
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2017-07-05
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 2013-06-27
    相关资源
    最近更新 更多