Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将dplyr SE与ggplot2一起使用_R_Ggplot2_Dplyr - Fatal编程技术网

将dplyr SE与ggplot2一起使用

将dplyr SE与ggplot2一起使用,r,ggplot2,dplyr,R,Ggplot2,Dplyr,我经常在包装函数中将dplyr与ggplot2结合起来进行分析。当我使用tidyeval进入新的NSE/SE范式v.0.7.1时,我正在努力让这种组合发挥作用。我发现,ggplot还不能理解无引号的quoser。以下操作不起作用: example_func <- function(col) { col <- enquo(col) mtcars %>% count(!!col) %>% ggplot(aes((!!col), n)) + geom_

我经常在包装函数中将
dplyr
ggplot2
结合起来进行分析。当我使用
tidyeval
进入新的NSE/SE范式v.0.7.1时,我正在努力让这种组合发挥作用。我发现,
ggplot
还不能理解无引号的quoser。以下操作不起作用:

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
示例_func%
ggplot(aes(!!col),n))+
几何图形栏(stat=“identity”)
}
示例_func(气缸)
#错误!col:参数类型无效
我目前使用以下解决方法。但我想一定有更好的办法

example_func2 <- function(col) {
  col <- enquo(col)
  mtcars %>% count(!!col) %>% 
    ggplot(aes_string(rlang::quo_text(col), "n")) +
    geom_bar(stat = "identity")
}
示例\u func2%
ggplot(aes_字符串(rlang::quo_文本(col),“n”))+
几何图形栏(stat=“identity”)
}

请告诉我将这两者结合起来的最佳方式。谢谢

对此,似乎有两种思考方式

方法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()
库(tidyverse)
关注1_数据%
总结(n=n())
}
关注2_%
相关数据(am)%>%
concern2_绘图()
这或多或少实现了您想要做的事情,并将关注点分开(值得一提)

方法2:接受并等待 问题是:tidyeval尚未在ggplot2中实现。 -科林·费伊


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

如果您已经在处理Quosure,那么使用
aes\uu
更容易,它接受引用为公式的输入:
aes\uu(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)
库(tidyverse)
示例_func%
ggplot(aes_uz(col,~n))+
几何图形栏(stat=“identity”)
}
示例_func(气缸)

如果它是一个字符串,你需要
aes_字符串
,那它有什么问题?它感觉像是一个大迂回,引用,然后使用quo_文本,然后使用aes_字符串。希望有一个更直接的解决方案。然而,当使用tidyeval时,我发现tidyeval很快就会出现在ggplot中。我喜欢您的两步方法,本例中唯一的缺点是您在绘图上丢失了列名,但这当然很容易修复。