循环给定 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(...)))
假设我想要一个打印所有给定表达式的函数:
> 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(...)))