Работаю над приложением RShiny, и в настоящее время у меня проблемы с функцией dplyrgroup_by(). У меня есть две определенные функции:
gather_info: находит категорию с самым высоким/самым низким средним значениемpaste_info: вызывает gather_info и возвращает соответствующую категорию и значениеЦель состоит в том, чтобы вернуть строку, которая, учитывая фрейм данных и категориальную переменную, указывает самую высокую и самую низкую производительность категории и значение указанной категории.
Вызов gather_info с соответствующими аргументами работает, как и ожидалось. Однако paste_info последовательно возвращает:
Error in `group_by()`:
! Must group by variables found in `.data`.
✖ Column `grp.col` is not found.
Вот воспроизводимый пример, где желаемый результат paste_info таков: «Учитывая ваши данные, ваша группа с лучшими показателями — это группа Cat1 с результатом 90%, а группа с худшими показателями — группа Cat2 с результатом 20%.»:
gather_info <- function(df, grp.col, maxm) {
df |>
mutate_if (
.predicate = function(x) is.character(x),
.funs = function(x) str_to_title(x)
) |>
group_by({{ grp.col }}) |>
summarize(percentage = round(mean(value, na.rm=TRUE) * 100, 2)) |>
arrange(desc(percentage)) %>% # c'est un pipe
{if (maxm) head(., 1) else tail(., 1)}
}
paste_info <- function(df, grp.col) {
high_df <- gather_info(df, grp.col, maxm=TRUE)
low_df <- gather_info(df, grp.col, maxm=FALSE)
paste0("Given your data, your best performing group is ",
high_df |> pull(grp.col), " scoring ", high_df$percentage, "%",
" and your worst performing group is ",
low_df |> pull(grp.col), " scoring ", low_df$percentage, "%.")
}
df <- data.frame(
category=c('cat1', 'cat1', 'cat2', 'cat2', 'cat2', 'cat3', 'cat3'),
value=c(1,0.8,0.2,0.3,0.1,0.5,0.5)
)
# returns category, value with highest mean value
gather_info(df, category, maxm=TRUE)
# returns category, value with lowest mean value
gather_info(df, category, maxm=FALSE)
# does not work
paste_info(df, category)
Любая помощь очень ценится. Спасибо!





Проблема в том, что внутри paste_info вы должны использовать {{ для передачи столбца группировки grp.col в gather_info, а также при вызове pull. По той же причине вы должны использовать {{ в group_by внутри gather_info
В некотором смысле {{ переводится, например. gather_info(df, {{ grp.col }}, maxm = TRUE) в gather_info(df, category, maxm = TRUE), то есть вы переходите category в gather_info. Без {{ имя столбца, хранящееся в grp.col, не будет «вставлено» в выражение или вызов функции. Следовательно, gather_info примет grp.col как есть и интерпретирует его как имя столбца группировки. Но так как в ваших данных нет столбца с именем grp.col, вы получаете ошибку.
Для получения дополнительной информации о том, зачем нужен {{, см. Что такое маскирование данных и зачем мне {{?.
library(dplyr)
paste_info <- function(df, grp.col) {
high_df <- gather_info(df, {{ grp.col }}, maxm = TRUE)
low_df <- gather_info(df, {{ grp.col }}, maxm = FALSE)
paste0(
"Given your data, your best performing group is ",
high_df |> pull({{ grp.col }}), " scoring ", high_df$percentage, "%",
" and your worst performing group is ",
low_df |> pull({{ grp.col }}), " scoring ", low_df$percentage, "%."
)
}
paste_info(df, category)
#> [1] "Given your data, your best performing group is Cat1 scoring 90% and your worst performing group is Cat2 scoring 20%."
Я отредактировал свой вопрос, добавив объяснение своими словами и ссылку на то, зачем нам нужен {{.
Обман, спасибо ^ Я могу понять, почему это так, но не могли бы вы объяснить, почему это исправление?