循环给定 R 中函数的未加引号的表达式

loop over unquoted expressions given to a function in R

假设我想要一个打印所有给定表达式的函数:

> foo(abc(def),gh[i],j)
abc(def)
gh[i]
j

想知道有没有什么好的方法。我已经弄清楚如何使用递归来做到这一点:

foo <- function(x, ...) {
    if (!is.missing(x)) {
        print(substitute(x))
        foo(...)
    }
}

但我觉得必须有更好的方法,使用循环或可能使用 list() 和 lapply() 或其他方法的某种方式。

您可以使用特殊的 ...() 语法

foo <- function(...) {
  exprs <- substitute(...())
  print(exprs)
}
foo(abc(def), gh[i], j)

此处 exprs 将是一个列表,您可以根据需要对其进行迭代。

事实证明,有几种不同的方法可以实现这一点。我想我要使用的方式是:

foo <- function(...) {
    for (expr in as.list(sys.call()[-1])) {
        print(expr)
    }
}

做同样事情的另一种方法:

as.list(substitute({...})[-1])

另一种选择,不需要[-1]:

eval(substitute(expression(...)))