6

我正在编写一个使用 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)
          })

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

有没有相当于usethis::use_pipe()但是对于来自的运营商的东西rlang

4

1 回答 1

10

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

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

!!TRUE
#> [1] TRUE
!!!TRUE
#> [1] FALSE

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

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

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

于 2019-04-19T15:20:23.587 回答