dplyr 0.7 的发布包括对 dplyr 编程的重大改革。我仔细阅读了这份文档,并试图了解它将如何影响我对 dplyr 的使用。
这是我在使用 dplyr 构建报告和聚合函数时使用的一个常见习语:
my_report <- function(data, grouping_vars) {
data %>%
group_by_(.dots=grouping_vars) %>%
summarize(x_mean=mean(x), x_median=median(x), ...)
}
这里,grouping_vars
是一个字符串向量。
我喜欢这个习惯用法,因为我可以从其他地方传入字符串向量,比如文件或 Shiny 应用程序的反应式 UI,但它对于交互式工作也不是太糟糕。
但是,在使用 dplyr vignette 的新编程中,我看不到如何使用新的 dplyr 完成类似操作的示例。我只看到了传递字符串不再是正确方法的示例,而我必须使用 quosures。
我很高兴采用 quosures,但我究竟如何从字符串中得到 dplyr 在这里所期望的 quosures?期望整个 R 生态系统为 dplyr 提供 quosures 似乎是不可行的——很多时候我们会得到字符串并且它们必须被转换。
这是一个示例,显示您现在应该做什么,以及我的旧习语如何不起作用:
library(dplyr)
grouping_vars <- quo(am)
mtcars %>%
group_by(!!grouping_vars) %>%
summarise(mean_cyl=mean(cyl))
#> # A tibble: 2 × 2
#> am mean_cyl
#> <dbl> <dbl>
#> 1 0 6.947368
#> 2 1 5.076923
grouping_vars <- "am"
mtcars %>%
group_by(!!grouping_vars) %>%
summarise(mean_cyl=mean(cyl))
#> # A tibble: 1 × 2
#> `"am"` mean_cyl
#> <chr> <dbl>
#> 1 am 6.1875