使用 tidyeval 传递多个参数 - 不同的方法?
Passing multiple arguments with tidyeval - different methods?
我正在尝试理解 tidyeval 并遇到了来自 dplyr 的 tutorial from Lionel Henry. I've also read the vignette。他们描述了传递多个参数的不同方法,例如使用 group_by
时。
下面两个例子有什么区别?简单来说(如果可能):我应该使用哪一个,为什么?
library(dplyr)
mean_by <- function(data, var, ...) {
var <- enquo(var)
data %>%
group_by(...) %>%
summarise(avg = mean(!! var))
}
mean_by2 <- function(data, var, ...) {
var <- enquo(var)
group <- quos(...)
data %>%
group_by(!!! group) %>%
summarise(avg = mean(!! var))
}
all_equal(mean_by(starwars, height, species, eye_color),
mean_by2(starwars, height, species, eye_color))
#> [1] TRUE
Created on 2018-10-05 by the [reprex
package](http://reprex.tidyverse.org) (v0.2.0).
它们在功能上是等价的。如果您不修改点中的参数(更改它们的名称、围绕参数包装函数,...),最好直接传递 ...
,因为它更简洁和可读。
整洁的评估手册的这一部分探讨了这些问题:https://tidyeval.tidyverse.org/multiple.html
我正在尝试理解 tidyeval 并遇到了来自 dplyr 的 tutorial from Lionel Henry. I've also read the vignette。他们描述了传递多个参数的不同方法,例如使用 group_by
时。
下面两个例子有什么区别?简单来说(如果可能):我应该使用哪一个,为什么?
library(dplyr)
mean_by <- function(data, var, ...) {
var <- enquo(var)
data %>%
group_by(...) %>%
summarise(avg = mean(!! var))
}
mean_by2 <- function(data, var, ...) {
var <- enquo(var)
group <- quos(...)
data %>%
group_by(!!! group) %>%
summarise(avg = mean(!! var))
}
all_equal(mean_by(starwars, height, species, eye_color),
mean_by2(starwars, height, species, eye_color))
#> [1] TRUE
Created on 2018-10-05 by the [reprex
package](http://reprex.tidyverse.org) (v0.2.0).
它们在功能上是等价的。如果您不修改点中的参数(更改它们的名称、围绕参数包装函数,...),最好直接传递 ...
,因为它更简洁和可读。
整洁的评估手册的这一部分探讨了这些问题:https://tidyeval.tidyverse.org/multiple.html