Используйте 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 не получит эту функциональность. Это просто еще не там.

Другие вопросы по тегам