【问题标题】:Capture ... passed to function without mangling the !! operatorCapture ... 传递给函数而不破坏 !!操作员
【发布时间】:2018-01-30 13:46:47
【问题描述】:

我需要将... 转发到函数参数,将符号提取为代码,并将它们转换为字符,同时保留名称。我通常为此使用match.call(expand.dots = FALSE)$...,但它破坏了!! 运算符。

当前行为

f <- function(...){
  match.call(expand.dots = FALSE)$...
}

f(a = 1234, b = !!my_variable)

## $a
## [1] 1234
## 
## $b
## !(!my_variable)

期望的行为

f <- function(...){
  # whatever works
}

f(a = 1234, b = !!my_variable)

## $a
## [1] 1234
## 
## $b
## !!my_variable

编辑更好:

f <- function(...){
  # whatever works
}

my_variable <- "my value"
f(a = 1234, b = !!my_variable)

## $a
## [1] 1234
## 
## $b
## [1] "my_value"

【问题讨论】:

  • 这会影响哪些下游后果? R 语言本身没有合适的!! 运算符。 rlang 包将双重函数调用解释为特殊的含义,但如果使用默认解析器解析它,则会得到双重否定。
  • 跟进 MrFlick 的解决方案是简单地检查 quoted 的值是否为 double !并单独处理该案件
  • @MrFlick,我想保留稍后评估!! 的选项。我也愿意像上面的编辑一样立即评估!!。从@lionel 最近的网络研讨会(我假设他是同一个 Lionel)中,我记得这在rlang 中是可能的,但我不记得如何了。
  • 没关系:我认为f &lt;- function(...){rlang::exprs(...)} 工作得很好。 @MrFlick,如果您发布该答案,我会接受。你把我推向了正确的方向。
  • 其实我想看看你是怎么用的。我自己没有使用过这个功能。如果您发布自己的答案,我很乐意投票。

标签: r tidyverse rlang


【解决方案1】:

以下代码似乎可以工作。用例是here。感谢 MrFlick 将我推向正确的方向。

f <- function(...){
  rlang::exprs(...)
}

my_variable <- "my value"
f(a = 1234, b = !!my_variable)

## $a
## [1] 1234
## 
## $b
## [1] "my_value"

编辑:顺便说一句,我仍在寻找一种无需评估即可解析!! 的方法。这将增强与https://github.com/ropensci/drake/issues/200 相关的用户端功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 2013-07-11
    相关资源
    最近更新 更多