使用dplyr SE和ggplot2

时间:2017-07-24 11:19:49

标签: r ggplot2 dplyr

我经常将dplyrggplot2结合在包装函数中进行分析。当我转向使用tidyeval的v.0.7.1的新NSE / SE范例时,我正在努力使这个组合起作用。我发现ggplot不理解不带引号的quosers(还)。以下不起作用:

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 个答案:

答案 0 :(得分:2)

似乎有两种思考方式。

方法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中实现。    - Colin Fay from link

我认为这是目前不在ggplot2中的支持,但我无法想象ggplot2不会获得此功能。它还没有。

答案 1 :(得分: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)