如何在包中使用 rlang 运算符?

rma*_*gno 6 r r-package non-standard-evaluation tidyverse rlang

我正在编写一个使用 tidyverse 函数的包,即使用非标准评估,dplyr::filter例如:

setMethod("filter_by_id",
          signature(x = "studies", id = "character"),
          definition = function(x, id) {
            study_id <- rlang::expr(study_id)
            lst <- purrr::map(s4_to_list(x), ~ dplyr::filter(.x, !!study_id %in% id))
            y <- list_to_s4(lst, "studies")
            return(y)
          })
Run Code Online (Sandbox Code Playgroud)

我正在使用!!运算符(我可能会使用rlang包中的其他几个),我想知道是否需要像使用 pipe-operator%>%一样显式导入它,如以下问题中所述:R: use magrittr pipe operator in自己写的包

有什么等价于usethis::use_pipe()但对于运营商 from rlang

Pau*_*ain 8

根据 Hadley 的说法,!!运算符更像是一种礼貌的虚构,而不是实际的运算符,这就是您不需要导入它的原因。

到目前为止,我们已经表现得好像!和 !!!是常规前缀运算符,如 +、- 和 !。他们不是。从 R 的角度来看,!! 和 !!!只是重复应用!:

!!TRUE
#> [1] TRUE
!!!TRUE
#> [1] FALSE
Run Code Online (Sandbox Code Playgroud)

一旦rlang函数检测到这个“运算符”,它就会以不同的方式对待它以执行必要的整洁评估(这就是为什么运算符只在rlang上下文中有用)

!! 和 !!!在所有由 rlang 提供支持的引用函数中表现特别,在那里它们表现得像真正的运算符,优先级相当于一元 + 和 -。

这就是为什么你只需要导入rlang你想要的函数,因为处理的逻辑!!在于rlang内部,而不是像magrittr管道这样的单独函数。

  • 是的,您不需要导入 `{{}}`,因为它们仅在 `rlang` 上下文中特殊。我认为这是一种处理整洁评估的更干净的方法,而不是使用 `my_var &lt;- enquo(my_var)` 和 `!!my_var` (2认同)