如何将ggplot和dplyr组合成一个函数?

ℕʘʘ*_*ḆḽḘ 12 r ggplot2 dplyr tidyeval

考虑这个简单的例子

library(dplyr)
library(ggplot2)

dataframe <- data_frame(id = c(1,2,3,4),
                        group = c('a','b','c','c'),
                        value = c(200,400,120,300))

# A tibble: 4 x 3
     id group value
  <dbl> <chr> <dbl>
1     1     a   200
2     2     b   400
3     3     c   120
4     4     c   300
Run Code Online (Sandbox Code Playgroud)

在这里,我想编写一个将数据帧和分组变量作为输入的函数.理想情况下,在分组和聚合后,我想打印一个ggpplot图表.

这有效:

get_charts2 <- function(data, mygroup){

  quo_var <- enquo(mygroup)

  df_agg <- data %>% 
    group_by(!!quo_var) %>% 
    summarize(mean = mean(value, na.rm = TRUE),
              count = n()) %>% 
    ungroup()

  df_agg
}



> get_charts2(dataframe, group)
# A tibble: 3 x 3
  group  mean count
  <chr> <dbl> <int>
1     a   200     1
2     b   400     1
3     c   210     2
Run Code Online (Sandbox Code Playgroud)

不幸的是,添加ggplotFAILS上面的功能

 get_charts1 <- function(data, mygroup){

  quo_var <- enquo(mygroup)

  df_agg <- data %>% 
    group_by(!!quo_var) %>% 
    summarize(mean = mean(value, na.rm = TRUE),
              count = n()) %>% 
  ungroup()

  ggplot(df_agg, aes(x = count, y = mean, color = !!quo_var, group = !!quo_var)) + 
    geom_point() +
    geom_line() 
}


> get_charts1(dataframe, group)
Error in !quo_var : invalid argument type
Run Code Online (Sandbox Code Playgroud)

我不明白这里有什么问题.有任何想法吗?谢谢!

编辑:这里有趣的后续如何使用ggplot和dplyr从函数中的quosures创建因子变量?

MrF*_*ick 12

ggplot还不支持整洁的eval语法(你不能使用!!).您需要使用更传统的标准评估调用.您可以aes_q在ggplot 中使用它来帮助解决这个问题.

get_charts1 <- function(data, mygroup){

  quo_var <- enquo(mygroup)

  df_agg <- data %>% 
    group_by(!!quo_var) %>% 
    summarize(mean = mean(value, na.rm = TRUE),
              count = n()) %>% 
    ungroup()

  ggplot(df_agg, aes_q(x = quote(count), y = quote(mean), color = quo_var, group = quo_var)) + 
    geom_point() +
    geom_line() 
}


get_charts1(dataframe, group)
Run Code Online (Sandbox Code Playgroud)

  • 因为`aes_q`需要符号(或解析为符号的变量).在这种情况下,你只想使用`count`,而不是名为"count"的变量,所以你引用它.但是`quo_var`是一个包含符号式表达式`group`的变量,所以你需要评估那个变量. (3认同)
  • 这是一个更复杂的问题,可能会通过单独的问题更好地解决.像`color = bquote(factor(.(quo_var [[2]]))))`之类的东西可能会起作用. (2认同)

Tun*_*ung 5

ggplot2 v3.0.02018年7月发布的支持!!(bang bang)!!!,和:=.aes_()/aes_q()并且aes_string()软弃用.

OP的原始代码应该有效

library(tidyverse)

get_charts1 <- function(data, mygroup){

  quo_var <- enquo(mygroup)

  df_agg <- data %>% 
    group_by(!!quo_var) %>% 
    summarize(mean = mean(value, na.rm = TRUE),
              count = n()) %>% 
    ungroup()

  ggplot(df_agg, aes(x = count, y = mean, 
                color = !!quo_var, group = !!quo_var)) + 
    geom_point() +
    geom_line() 
}

get_charts1(dataframe, group)
Run Code Online (Sandbox Code Playgroud)

reprex包(v0.2.0)创建于2018-04-04.