我经常将dplyr
与ggplot2
结合在包装函数中进行分析。当我转向使用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")
}
请告诉我将这两者结合起来的最佳方法。谢谢!
答案 0 :(得分:2)
似乎有两种思考方式。
我喜欢我的绘图内容与我的争吵内容非常分开。此外,您可以为您的组命名,这是解决问题的最简单方法[虽然您确实松开了原始列名称]。因此,解决您尝试做的事情的一种方法可以是通过;
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()
这可以实现你或多或少的努力,并将问题分开(值得一提)。
事情是: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)