Программирование с помощью dplyr с использованием строки в качестве входного

Я хотел бы написать функцию, которая использует dplyr внутри, и я предоставляю имена переменных в виде строк. К сожалению, использование NSE для dplyr делает его довольно сложным. Из программирования с dplyr я получаю следующий пример

my_summarise <- function(df, var) {
  var <- enquo(var)

  df %>%
    group_by(!!var) %>%
    summarise(a = mean(a))
}

my_summarise(df, g1)

Тем не менее, я хотел бы написать функцию, где вместо g1 я мог бы предоставить "g1" и я не могу обернуться, как это сделать.

Ответ 1

Насколько я знаю, вы можете использовать as.name или sym (из пакета rlang - я не знаю, будет ли dplyr импортировать его в конце концов):

library(dplyr)
my_summarise <- function(df, var) {
  var <- rlang::sym(var)
  df %>%
    group_by(!!var) %>%
    summarise(mpg = mean(mpg))
}

или же

my_summarise <- function(df, var) {
  var <- as.name(var)
  df %>%
    group_by(!!var) %>%
    summarise(mpg = mean(mpg))
}

my_summarise(mtcars, "cyl")
# # A tibble: 3 × 2
#     cyl      mpg
#   <dbl>    <dbl>
# 1     4 26.66364
# 2     6 19.74286
# 3     8 15.10000

Ответ 2

Использование местоимения .data из rlang - это еще один вариант, который работает непосредственно с именами столбцов, хранящимися в виде строк.

Функция с .data будет выглядеть как

my_summarise <- function(df, var) {
     df %>%
          group_by(.data[[var]]) %>%
          summarise(mpg = mean(mpg))
}

my_summarise(mtcars, "cyl")
# A tibble: 3 x 2
    cyl   mpg
  <dbl> <dbl>
1     4  26.7
2     6  19.7
3     8  15.1