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

7

我正在编写一个使用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包中的其他一些运算符),想知道是否需要像管道运算符%>% 一样明确导入它,就像这个问题中所解释的那样:R:在自己编写的包中使用magrittr pipe运算符
是否有类似于usethis::use_pipe()的东西,但是适用于rlang中的运算符?

3
如果您经常使用rlang,那么最好使用importFrom,因为use_this没有这个功能。您还可以自定义自己的use_quasi。在我看来,use_pipe只是一个快捷方式,实际上与importFrom相同。 - NelsonGon
1个回答

11
根据Hadley的说法,!!运算符更像是礼貌性虚构而不是实际运算符,这就是为什么你不需要导入它的原因。

So far we have acted as if !! and !!! are regular prefix operators like + , -, and !. They’re not. From R’s perspective, !! and !!! are simply the repeated application of !:

!!TRUE
#> [1] TRUE
!!!TRUE
#> [1] FALSE
一旦{{rlang}}函数检测到这个“操作符”,它将以不同的方式处理它以执行必要的整洁评估(这就是为什么该操作符只在{{rlang}}上下文中有用)。

!!和!!!在由{{rlang}}提供支持的所有引用函数中都有特殊行为,它们的优先级相当于一元+和-。

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

1
那么这也适用于 {{ }} 吗? - user10917479
2
是的,您不需要导入 {{}},因为它们只在 rlang 上下文中特殊。我认为这是处理整洁评估的更清洁的方法,而不是使用 my_var <- enquo(my_var)!!my_var - Paul Wildenhain
@PaulWildenhain,截至rlang 0.4.0版本,{{}}在几乎任何函数上下文中都可以有效使用,这个说法仍然正确吗? - Doctor David Anderson
嗯,据我所知,在任何函数上下文中都不能使用 {{}}。我认为它们只能在包的作者实现了整洁评估的情况下使用。无论如何,您仍然不需要导入它们,它们只在整洁评估上下文中特殊。 - Paul Wildenhain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接