use*_*313 5 arguments r metaprogramming function rlang
让我们考虑一个典型的deparse(substitute(R 调用:
f1 <-function(u,x,y)
{print(deparse(substitute(x)))}
varU='vu'
varX='vx'
varY='vy'
f1(u=varU,x=varX,y=varY)
Run Code Online (Sandbox Code Playgroud)
这导致
[1] "varX"
Run Code Online (Sandbox Code Playgroud)
这是我们期望和想要的。
然后,麻烦来了,我尝试使用...参数获得类似的行为,即
f2 <- function(...)
{ l <- list(...)
x=l$x
print(deparse(substitute(x))) ### this cannot work but I would like something like that
}
Run Code Online (Sandbox Code Playgroud)
毫不奇怪,这不起作用:
f2(u=varU,x=varX,y=varY)
[1] "\"vx\"" ### wrong ! I would like "varX"
Run Code Online (Sandbox Code Playgroud)
我试图使用不同的解决方案组合来获得预期的行为,但没有一个给我提供预期的结果,而且似乎我对懒惰的评估仍然不够清楚,无法在合理的时间内找到操作方法。
您可以通过执行获得所有未评估参数的列表
match.call(expand.dots = FALSE)$...
Run Code Online (Sandbox Code Playgroud)
或者,如果你只有点参数,通过
as.list(match.call()[-1L])
Run Code Online (Sandbox Code Playgroud)
这将为您提供一个命名列表,类似于list(...),但采用未评估的形式(类似于substitute单个参数的作用)。
rlang::quos(...)如果您愿意使用 {rlang} 包,则使用另一种方法,它以稍微不同的形式返回类似的结果。