如何在 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')
我想将参数传递给一个函数,这些参数在函数中使用之前不会被计算。作为一个简单的例子,如果我想将 ... = 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')