将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中。我喜欢您的两步方法,本例中唯一的缺点是您在绘图上丢失了列名,但这当然很容易修复。