Чтобы сделать настраиваемую функцию гибкой для получения одного или нескольких вызывающих аргументов на формальный аргумент, я в настоящее время полагаюсь на "...":
library(dplyr)
foo <- function(data, ..., dv){
groups <- enquos(...)
dv <- enquo(dv)
data %>%
group_by(!!!groups) %>%
summarise(group_mean = mean(!!dv))
}
mtcars %>% foo(am, dv = mpg)
mtcars %>% foo(vs, am, dv = mpg)
Но «...» скрывает логику функции, и ее нельзя использовать в пользовательской функции с 2 или более формальными аргументами, требующими нескольких вызывающих аргументов.
Есть ли способ написать вышеупомянутую функцию для использования формального аргумента (например, "groups") вместо "...", который может получить одно имя вектора или вектор имен векторов в качестве аргумента (ов) ? Что-то вроде:
foo <- function(data, groups, dv){
groups <- enquos(groups)
dv <- enquo(dv)
data %>%
group_by(!!!groups) %>%
summarise(group_mean = mean(!!dv))
}
# Failing code
mtcars %>% foo(groups = c(vs, am), dv = mpg)
Обратите внимание, что этот код будет работать, но необходимо, чтобы пользователь не забывал использовать quos () в теле функции:
foo <- function(data, groups, dv){
dv <- enquo(dv)
data %>%
group_by(!!!groups) %>%
summarise(group_mean = mean(!!dv))
}
mtcars %>% foo(groups = quos(vs, am), dv = mpg)
Вместо этого я бы хотел положиться на enquos () в теле функции.