【发布时间】:2017-11-16 20:16:25
【问题描述】:
试图编写一个相对简单的包装器来生成一些图,但不知道如何指定对指定为... 的分组变量的整洁评估,这是一个对变量进行分面但不通过分组进行区分的示例函数...
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 之后,我看不到或想不出哪里出错了。
谁能指出我的错误/给我指路?
【问题讨论】:
-
在你的第二个函数中,为什么你有两行
ggplot(aes(etc.))? -
如果您使用
quo(...)而不是quos(...),那么aes_和aes_(~value, color = quo_group)中一切正常。但也许你需要一个分组变量列表来做别的事情? -
哦,我明白了,
quos返回一个列表。因此,如果您只想使用从quos(...)获取的 1 元素列表的第一个元素,则需要在aes_中使用color = quo_group[[1]]。 -
@FlorianGD 转录两个版本时出错,现已更正。
-
@aosmith
quo_group[[1]]可以解决问题,但似乎与 Programming with dplyr : capturing multiple variables 文档不一致。
标签: r ggplot2 dplyr rlang tidyeval