Экспорт значений, переданных в enquos, в виде строки формата name1, name2, nameN, - PullRequest
1 голос
/ 13 марта 2020

В этом примере у меня есть простая функция, принимающая имена переменных, переданные через ..., и использующая функцию 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, ...".

1 Ответ

1 голос
/ 13 марта 2020

Вы можете использовать sapply для этого и свернуть с помощью toString:

sample_function <- function(x, ...) {
  group_vars <- enquos(...)

  assign(x = "used_group_variables",
         value = toString(sapply(group_vars, quo_name)),
         envir = globalenv())

  x %>%
    group_by(!!!group_vars) %>%
    summarise(num_obs = n())
}

Вывод:

mtcars %>% sample_function(am, cyl)

used_group_variables
# [1] "am, cyl"

Редактировать : как предложенный @LionelHenry в комментарии, вы можете использовать as_label вместо quo_name, так как последний вводит в заблуждение и, скорее всего, не рекомендуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...