我想编写使用 dplyr 动词的函数,这意味着我必须涉入rlang
.
提供一个具体的例子,假设我想使用purrr::map_df()
迭代 a 中的变量dplyr::group_by()
. The 使用 dplyr 编程小插图走过写一个my_summarise()
功能;使用的方法rlang::enquo()
在分组变量上,然后取消引用!!
。
这种方法可以创建一个类似 dplyr 的新函数,该函数采用不带引号的变量名(my_summarise(df, g1)
在小插图中)。
相反,我想 purrr 以字符串形式提供变量名称。是rlang::sym()
正确的方法是这样做吗?好像不是,因为sym()
dplyr 编程小插图中没有提到,rlang 中也几乎没有提到整洁的评价文章。有没有更好的办法?
library(tidyverse)
my_summarise <- function(df, group_var) {
group_var <- rlang::sym(group_var)
df %>%
group_by(!!group_var) %>%
summarise(mpg = mean(mpg))
}
# This works. Is that a good thing?
purrr::map_df(c("cyl", "am"), my_summarise, df = mtcars)
# A tibble: 5 x 3
cyl mpg am
<dbl> <dbl> <dbl>
1 4.00 26.7 NA
2 6.00 19.7 NA
3 8.00 15.1 NA
4 NA 17.1 0
5 NA 24.4 1.00
作为后续,为什么简单地取消引用(不首先应用enquo
or sym
)有时工作?在下面的例子中,为什么select()
按预期工作但是group_by()
不是吗?
x <- "cyl"
select(mtcars, !!x)
group_by(mtcars, !!x)
更新:答案与取消引用无关。就是那个select
更灵活,可以处理字符串,而group_by
can't.
其他参考:这个博客文章作者:埃德温·托恩。