Допустим, вам нужна версия следующей функции, которая принимает несколько входов вместо одного var
:
mean_by <- function(data, var, by) {
data %>%
group_by({{ by }}) %>%
summarise(average = mean({{ var }}, na.rm = TRUE))
}
Вы не можете просто передать ...
для суммирования, потому что тогда пользователь должен сам позвонить mean()
.
mean_by <- function(data, var, ..., by) {
data %>%
group_by({{ by }}) %>%
summarise(...)
}
mtcars %>% mean_by(foo = disp)
#> Error: Column `foo` must be length 1 (a summary value), not 32
mtcars %>% mean_by(foo = mean(disp))
#> # A tibble: 1 x 1
#> foo
#> <dbl>
#> 1 231.
Решение состоит в том, чтобы заключить точки в кавычки, изменить каждый из входов, чтобы они были заключены в новый вызов mean()
, а затем соединить их обратно:
mean_by <- function(data, ..., by) {
# `.named` makes sure the dots have default names, if not supplied
dots <- enquos(..., .named = TRUE)
# Go over all inputs, and wrap them in a call
dots <- lapply(dots, function(dot) call("mean", dot, na.rm = TRUE))
# Finally, splice the expressions back into `summarise()`:
data %>%
group_by({{ by }}) %>%
summarise(!!!dots)
}
Мы рассматриваем, как можно улучшить синтаксис для этого случая. Ранние мысли в http://rpubs.com/lionel-/superstache