【问题标题】:Deparse, substitute with three-dots arguments解析,用三点参数替换
【发布时间】:2019-07-27 21:39:17
【问题描述】:

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

我尝试使用不同的解决方案组合来获得预期的行为,但没有一个能够为我提供预期的结果,而且我似乎对惰性评估仍然不够清楚,无法在合理的时间内找到自己的操作方法。

【问题讨论】:

  • 你在找f2 &lt;- function(...) as.character(as.list(match.call())$x)吗?
  • @chinsoon12 这行得通!

标签: r function arguments metaprogramming rlang


【解决方案1】:

您可以通过以下方式获取所有未评估参数的列表

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 2019-02-23
    相关资源
    最近更新 更多