Используйте dplyr SE с ggplot2
Я часто совмещаю dplyr
с ggplot2
в функции обертки для анализа. Поскольку я перехожу к новой парадигме NSE / SE v.0.7.1 с tidyeval
Я изо всех сил пытаюсь заставить эту комбинацию работать. я нашел это ggplot
не понимает цитаты без кавычек (пока). Следующее не работает:
example_func <- function(col) {
col <- enquo(col)
mtcars %>% count(!!col) %>%
ggplot(aes((!!col), n)) +
geom_bar(stat = "identity")
}
example_func(cyl)
# Error in !col : invalid argument type
В настоящее время я использую следующие обходные пути. Но я предполагаю, что должен быть лучший путь.
example_func2 <- function(col) {
col <- enquo(col)
mtcars %>% count(!!col) %>%
ggplot(aes_string(rlang::quo_text(col), "n")) +
geom_bar(stat = "identity")
}
Пожалуйста, покажи мне, как лучше всего объединить эти два. Спасибо!
2 ответа
Если вы уже обрабатываете вопросы, проще использовать aes_
который принимает входные данные, указанные в виде формулы: aes_(col, ~n)
,
Этот фрагмент кода решает вашу проблему:
library(tidyverse)
example_func <- function(col) {
col <- enquo(col)
mtcars %>% count(!!col) %>%
ggplot(aes_(col, ~n)) +
geom_bar(stat = "identity")
}
example_func(cyl)
Кажется, есть два способа думать об этом.
Подход 1: Разделение интересов.
Мне нравится, что мои сюжеты очень отделены от моих спорных моментов. Кроме того, вы можете назвать свою группу, которая кажется самым простым способом решения вашей проблемы [хотя вы потеряли оригинальное имя столбца]. Таким образом, один метод решения того, что вы пытаетесь сделать, может быть через;
library(tidyverse)
concern1_data <- function(df, col) {
group <- enquo(col)
df %>%
group_by(group = !!group) %>%
summarise(n = n())
}
concern2_plotting <- function(df){
ggplot(data=df) +
geom_bar(aes(group, n), stat = "identity")
}
mtcars %>%
concern1_data(am) %>%
concern2_plotting()
Это позволяет добиться того, что вы пытаетесь сделать более или менее, и не беспокоиться (что заслуживает упоминания).
Подход 2: Принять и подождать
Дело в том, что tidyeval еще не реализован в ggplot2. - Колин Фэй по ссылке
Я думаю, что это поддержка, которой в настоящее время нет в ggplot2, но я не могу представить, что ggplot2 не получит эту функциональность. Это просто еще не там.