稀疏,用三点参数替代

问题描述 投票:1回答:1

让我们考虑一个典型的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"

我尝试使用不同的解决方案组合来获得预期的行为,但没有一个提供我预期的结果,似乎我仍然不清楚lazy eval在合理的时间内找到自己的方法。

r function arguments metaprogramming rlang
1个回答
4
投票

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

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

或者,如果你只有点参数,通过

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

这将给你一个命名列表,类似于list(...),但是以其未评估的形式(类似于substitute对单个参数的作用)。

另一种方法是使用rlang::quos(...),如果你愿意使用{rlang}包,它会以稍微不同的形式返回类似的结果。

© www.soinside.com 2019 - 2024. All rights reserved.