如何扩展省略号(...)参数而不在R中进行评估

时间:2012-11-13 00:22:13

标签: r lazy-evaluation ellipsis

我需要一个接受任意数量参数的函数,并将它们作为表达式存储在变量中而不进行评估。我设法用match.call做到了,但它看起来有点像“kludgy”。

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()的原因太长而无法解释。

3 个答案:

答案 0 :(得分:14)

最惯用的方式是:

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

答案 1 :(得分:5)

使用.中的plyr作为原型

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

答案 2 :(得分:3)

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

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

示例:

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