淡化,用三点参数代替

时间:2019-03-06 09:17:44

标签: r function arguments metaprogramming 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)

结果

[1] "varX"

这是我们期望和想要的。

然后,麻烦了,我尝试使用...参数来获得类似的行为,即

f2 <- function(...)
{  l <- list(...)
  x=l$x
  print(deparse(substitute(x))) ### this cannot work but I would like something like that
}

这并不奇怪:

f2(u=varU,x=varX,y=varY)
[1] "\"vx\"" ### wrong ! I would like "varX"

我尝试使用不同的解决方案组合来获得预期的行为,但没有一个能提供预期的结果,而且我似乎还不太了解懒惰的评估方法,无法在合理的时间内找到方法。< / p>

1 个答案:

答案 0 :(得分:3)

您可以通过执行以下操作获取所有未评估参数的列表

match.call(expand.dots = FALSE)$...

或者,如果您具有点参数,则通过

as.list(match.call()[-1L])

这将为您提供一个命名列表,类似于list(...),但形式未经评估(类似于substitute对单个参数所做的操作)。

如果您愿意使用{rlang}软件包,则可以使用rlang::quos(...),它会以略有不同的形式返回相似的结果。