尝试编写一个相对简单的包装器来生成一些图,但是无法确定如何指定整理评估指定为...
的分组变量,这是一个面向变量但不通过分组区分的示例函数。
my_plot <- function(df = starwars,
select = c(height, mass),
...){
results <- list()
## Tidyeval arguments
quo_select <- enquo(select)
quo_group <- quos(...)
## Filter, reshape and plot
results$df <- df %>%
dplyr::filter(!is.na(!!!quo_group)) %>%
dplyr::select(!!quo_select, !!!quo_group) %>%
gather(key = variable, value = value, !!!quo_select) %>%
## Specify what to plot
ggplot(aes(value)) +
geom_histogram(stat = 'count') +
facet_wrap(~variable, scales = 'free', strip.position = 'bottom')
return(results)
}
## Plot height and mass as facets but colour histograms by hair_color
my_plot(df = starwars, select = c(height, mass), hair_color)
很棒,但是如何区分不同的hair_color
?通常这是在aes()
内完成的,但由于这是使用quos()
的结果(即quo_group
),我应该(我认为)使用aes_()
代替
my_plot <- function(df = starwars,
select = c(height, mass),
...){
results <- list()
## Tidyeval arguments
quo_select <- enquo(select)
quo_group <- quos(...)
## Filter, reshape and plot
results$df <- df %>%
dplyr::filter(!is.na(!!!quo_group)) %>%
dplyr::select(!!quo_select, !!!quo_group) %>%
gather(key = variable, value = value, !!!quo_select) %>%
## Specify what to plot, including colouring by the supplied ... groupings
ggplot(aes_(~value, colour = !!!quo_group)) +
geom_histogram(stat = 'count') +
facet_wrap(~variable, scales = 'free', strip.position = 'bottom')
return(results)
}
## Plot height and mass as facets but colour histograms by hair_color
my_plot(df = starwars, select = c(height, mass), hair_color)
Error in !quo_group : invalid argument type
在我出错的地方,我几次看不到或没看过Programming with dplyr。
任何人都可以指出我的错误/告诉我的方式吗?
答案 0 :(得分:2)
新发布的ggplot2 v3.0.0
在!!
内部支持aes()
。经过一些小的修改,您的功能现在可以正常工作
library(tidyverse)
my_plot <- function(df = starwars,
select = c(height, mass),
...){
results <- list()
## Tidyeval arguments
quo_select <- enquo(select)
# only need quo here, if quos is used then we need to `unlist` to
# convert its output from list to vector
quo_group <- quo(...)
## Filter, reshape and plot
results$df <- df %>%
dplyr::filter(!is.na(!!!quo_group)) %>%
dplyr::select(!!quo_select, !!!quo_group) %>%
gather(key = variable, value = value, !!!quo_select) %>%
## Specify what to plot, including coloring by the supplied dots `...`
ggplot(aes(value, color = !!quo_group, fill = !!quo_group)) + # unquote inside aes
geom_histogram(stat = 'count') +
facet_wrap(vars(variable), scales = 'free', strip.position = 'bottom')
return(results)
}
## Plot height and mass as facets but color histograms by hair_color
my_plot(df = starwars, select = c(height, mass), hair_color)
由reprex package(v0.2.0.9000)于2018-09-12创建。
答案 1 :(得分:0)
我不确定我理解这个问题。这是否满足要求?
library(ggplot2)
library(data.table)
your_plot <- function(df, select, color=NULL) {
df <- as.data.table(df)[, mget(na.omit(c(select, color)))]
ggplot(melt(df, color, select), aes_string(x=quote(value), color=color)) +
geom_histogram(stat="count") +
facet_wrap(~variable, scales="free", strip.position="bottom")
}
your_plot(dplyr::starwars, c("height", "mass"), "hair_color")
这使用melt
来堆叠select
变量,并为每个堆栈重复color
个变量。它还使用aes_string
,因为aes(x=value, color=color)
时color=NULL
失败。