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?
根据 Hadley 的说法,!!运算符更像是一种礼貌的虚构,而不是实际的运算符,这就是您不需要导入它的原因。
到目前为止,我们已经表现得好像!和 !!!是常规前缀运算符,如 +、- 和 !。他们不是。从 R 的角度来看,!! 和 !!!只是重复应用!:
Run Code Online (Sandbox Code Playgroud)!!TRUE #> [1] TRUE !!!TRUE #> [1] FALSE
一旦rlang函数检测到这个“运算符”,它就会以不同的方式对待它以执行必要的整洁评估(这就是为什么运算符只在rlang上下文中有用)
!! 和 !!!在所有由 rlang 提供支持的引用函数中表现特别,在那里它们表现得像真正的运算符,优先级相当于一元 + 和 -。
这就是为什么你只需要导入rlang你想要的函数,因为处理的逻辑!!在于rlang内部,而不是像magrittr管道这样的单独函数。