我知道如何制作支持使用 dplyr::enquo(variable)
对无引号函数参数 'variable' 进行准引用(quasi-quotation)的函数,或者需要对参数进行引用(quote)的函数,可以使用 rlang::sym("variable")
。有没有一种简单的方法可以使函数支持引用和无引用参数呢?
例如,dplyr::select()
同时允许 select(mtcars, mpg)
和 select(mtcars, "mpg")
两种方式。在构建一个能够同时支持两种方式的函数时,有一个需要考虑的问题是数据屏蔽(data masking)的影响,但我不确定是否需要在构建更复杂的函数时加以考虑。
我一直在查看 dplyr 函数的 GitHub 页面,但像 select 这样的简单函数都依赖于一个全新的包(tidyselect),所以情况比较复杂。我也没有在 Tidy evaluation book 中看到清晰的解释。下面是一个支持引用和无引用参数的 hack 函数,但这不是一个可靠的解决方案。我相信有更简单的方法。
library(dplyr)
data(mtcars)
test_func <- function(variable) {
if(nrow(count(mtcars, {{variable}})) == 1) {
variable <- rlang::sym(variable)
}
count(mtcars, {{variable}})
}
all_equal(
test_func(cyl),
test_func("cyl")
)
ensym()
,它实现了与=
左侧或library()
函数中相同的语义。 - Lionel Henryensym()
会失败?如果您需要将其存储为变量(例如在ggplot中进行标记),您不能将符号转换回字符字符串吗? - bhollyfoo("bar")
,他们可能会尝试quux <- "bar"; foo(quux)
,并且会困惑为什么它不能以同样的方式工作。 - Lionel Henry