如何在包中使用 rlang 运算符?
How to use rlang operators in a package?
我正在编写一个使用 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
包中的其他一些运算符),我想知道是否需要像管道一样显式导入它-运算符 %>%
,如以下问题所述:.
除了来自 rlang
的运算符之外,是否有等同于 usethis::use_pipe()
的东西?
根据 Hadley 的说法,!!
运算符更像是 polite fiction 而不是实际的运算符,这就是您不需要导入它的原因。
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
函数检测到这个 "operator" 它就会以不同的方式对待它以执行必要的整洁评估(这就是为什么该运算符仅在 rlang
上下文中有用)
!! and !!! behave specially inside all quoting functions powered by rlang, where they
behave like real operators with precedence equivalent to unary + and -.
这就是为什么你只需要导入你想要的 rlang
函数,因为处理 !!
的逻辑在 rlang
内部,而不是像 magrittr
管道.
我正在编写一个使用 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
包中的其他一些运算符),我想知道是否需要像管道一样显式导入它-运算符 %>%
,如以下问题所述:
除了来自 rlang
的运算符之外,是否有等同于 usethis::use_pipe()
的东西?
根据 Hadley 的说法,!!
运算符更像是 polite fiction 而不是实际的运算符,这就是您不需要导入它的原因。
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
函数检测到这个 "operator" 它就会以不同的方式对待它以执行必要的整洁评估(这就是为什么该运算符仅在 rlang
上下文中有用)
!! and !!! behave specially inside all quoting functions powered by rlang, where they behave like real operators with precedence equivalent to unary + and -.
这就是为什么你只需要导入你想要的 rlang
函数,因为处理 !!
的逻辑在 rlang
内部,而不是像 magrittr
管道.