如何在 R 中对“...”函数参数进行惰性求值?

How to do lazy-evaluation of "..." function arguments in R?

我想将参数传递给一个函数,这些参数在函数中使用之前不会被计算。作为一个简单的例子,如果我想将 ... = foo, 'bar' 传递给以下函数,而 foo 是在函数中定义的,我将如何处理:

  myfunc <- function(X, ...) {    
    for (foo in seq_along(X)) {
      cat(..., '\n')
    }
  }
  myfunc(X = 1:5, foo, 'bar')

我尝试使用 cat(substitute(...), '\n'),它似乎只是省略了 foo

谢谢!

这是一种方法

myfunc <- function(X, ...) { 
  dots <- eval(substitute(alist(...)))
  for (foo in seq_along(X)) {
    do.call("cat", c(dots, '\n'))
  }
}
myfunc(X = 1:5, foo, 'bar')
# 1 bar 
# 2 bar 
# 3 bar 
# 4 bar 
# 5 bar 

我们在未评估的对列表中捕获传递给 ... 的所有参数。然后,我们使用“do.call”将这些值注入到对 cat() 的调用中,并在本地环境中进行评估。

只要你不需要做类似

的事情,这就可以工作
test <- function() {
  bar <- "bar"
  myfunc(X = 1:5, foo, bar)
}
test()
#  Error in cat(foo, bar, "\n") : object 'bar' not found 

1) 使用 eval(substitute(...))

myfunc <- function(X, ...) {    
  for (foo in seq_along(X)) {
    eval(substitute(cat(..., "\n")))
  }
}
myfunc(X = 1:5, foo, 'bar')

给予:

1 bar 
2 bar 
3 bar 
4 bar 
5 bar 

2) defmacro 另一种方法是使用 gtools 中的 defmacro 创建宏:

library(gtools)

myfunc2 <- defmacro(X, DOTS, expr = {
  for (foo in seq_along(X)) {
    cat(..., "\n")
  }
})
myfunc2(X = 1:5, foo, 'bar')