Я хотел бы написать функции, использующие dplyr-глаголы, а это значит, что мне нужно войти в мутные воды rlang
.
Чтобы предоставить конкретный пример, скажем, я хочу использовать purrr::map_df()
для перебора переменных в dplyr::group_by()
. Виньетка с помощью dplyr проходит через написание my_summarise()
функция; подход состоит в том, чтобы использовать rlang::enquo()
в переменной группировки, а затем убрать кавычки с помощью !!
. Этот подход позволяет создать новую функцию, подобную dplyr, которая принимает имена переменных без кавычек (my_summarise(df, g1)
в виньетке).
Напротив, я хочу, чтобы мурлыкали имя переменной в виде строки. rlang::sym()
правильный ли способ сделать это? Похоже, что это не так, потому что sym()
не упоминается в виньетке программирования dplyr и почти не упоминается в rlang аккуратная оценочная статья. Есть ли способ лучше?
library(tidyverse)
my_summarise <- function(df, group_var) {
group_var <- rlang::sym(group_var)
df %>%
group_by(!!group_var) %>%
summarise(mpg = mean(mpg))
}
# This works. Is that a good thing?
purrr::map_df(c("cyl", "am"), my_summarise, df = mtcars)
# A tibble: 5 x 3
cyl mpg am
<dbl> <dbl> <dbl>
1 4.00 26.7 NA
2 6.00 19.7 NA
3 8.00 15.1 NA
4 NA 17.1 0
5 NA 24.4 1.00
В заключение, почему простое отключение цитирования (без предварительного применения enquo
или sym
) иногда срабатывает? В приведенном ниже примере, почему select()
работает должным образом, а group_by()
- нет?
x <- "cyl"
select(mtcars, !!x)
group_by(mtcars, !!x)
Обновление: ответ не о нецитировании. Дело в том, что select
более гибок и может обрабатывать строки, а group_by
- нет.
Другая ссылка: это сообщение в блоге Эдвина Тоена.
group_by(.data[[x]])
, еслиx
- строка. tidyverse.org/blog/2019/06/rlang-0 -4-0 16.02.2020