В этом примере у меня есть простая функция, принимающая имена переменных, переданные через ...
, и использующая функцию enquos
для передачи их в group_by
оператор в dplyr.
Basi c function
# Libraries
library(dplyr)
library(rlang)
sample_function <- function(x, ...) {
group_vars <- enquos(...)
x %>%
group_by(!!!group_vars) %>%
summarise(num_obs = n())
}
Results
mtcars %>% sample_function(cyl, am)
# A tibble: 6 x 3
# Groups: cyl [3]
cyl am num_obs
<dbl> <dbl> <int>
1 4 0 3
2 4 1 8
3 6 0 4
4 6 1 3
5 8 0 12
6 8 1 2
Задача
Я хотел бы расширить приведенную выше функцию и в дополнение к полученным результатам создайте новый скалярный символ, который будет отражать имена переменных, переданных в enquos
в формате: "var1, var2, ..."
.
Попытка
library(dplyr)
library(rlang)
sample_function <- function(x, ...) {
group_vars <- enquos(...)
# Problem:
# Create test object of quoted variables
assign(x = "used_group_variables",
value = quo_text(group_vars),
envir = globalenv())
# Summary
x %>%
group_by(!!!group_vars) %>%
summarise(num_obs = n())
}
Результаты
Полученная строка не соответствует требуемому формату.
used_group_variables
# [1] "structure(list(~cyl, ~am), .Names = c(\"\", \"\"), class = c(\"quosures\", \n\"list\"))"
Желаемые результаты
Только имена всех переменных, изначально переданных через enquos
, являются возвращается и вставляется вместе с "` "в качестве разделителя.
used_group_variables
# "cyl, am"
Примечания
- По общему признанию, присвоение значений глобальной среде изнутри Функция не является хорошей практикой. Это сделано только в иллюстративных целях. По сути, основная цель состоит в том, чтобы привести все, что находится в пределах
enquos
, к строке формата "name1, name2, ..."
.