Я изучал "Программирование с помощью dplyr" , потому что я хочу создавать функции, которые используют функции dplyr.Я хотел бы использовать функции, которые я делаю, как в блестящих приложениях, так и в интерактивном R.Для использования в глянце я хотел бы, чтобы эти функции принимали строковые аргументы и преобразовывали их в символы с помощью функции sym.Для использования в интерактивных сеансах я хотел бы, чтобы эти функции имели возможность не использовать строки.Поэтому функциям, которые я создаю, потребуется способ определить, являются ли определенные аргументы строками или нет.
Я нашел путь к этому.Мне просто любопытно, есть ли лучший и / или более элегантный способ сделать это.
В качестве примера я сделал простую функцию "my_summarise".Это другая версия функции "my_summarise" от виньетки.Он использует tryCatch, чтобы проверить, является ли аргумент group_var строкой.
library(dplyr)
df <- data.frame(g1 = c(1, 1, 2, 2, 2),
g2 = c(1, 2, 1, 2, 1),
a = c(1, 5, 4, 3, 2),
b = c(3, 1, 2, 5, 4))
# df:
# g1 g2 a b
# 1 1 1 3
# 1 2 5 1
# 2 1 4 2
# 2 2 3 5
# 2 1 2 4
my_summarise <- function(df, group_var) {
is_string <- tryCatch(sym(group_var), error = function(group_var) group_var)
if ("error" %in% class(is_string)) {
group_var <- enquo(group_var)
} else {
group_var <- sym(group_var)
}
df %>% group_by(!! group_var) %>%
summarise(a = mean(a))
}
my_summarise(df, g1)
# g1 a
# 1 3
# 2 3
my_summarise(df, "g1")
# g1 a
# 1 3
# 2 3
Редактировать: ответ Онямбу идеален.Я просто настроил использование нескольких функций Rlang вместо их базовых эквивалентов.
my_summarise <- function(df, group_var) {
group_var <- enexpr(group_var)
if(!is_symbol(group_var)) group_var <- sym(group_var) # instead of is.name and as.name you can use is.symbol and as.symbol or a mixture.
group_var <- enquo(group_var)
df %>% group_by(!! group_var) %>%
summarise(a = mean(a))
}