La programmation de l'évaluation Tidy et ggplot2
en essayant d'écrire un wrapper relativement simple pour produire quelques tracés, mais ne peut pas travailler sur la façon de spécifier l'évaluation ordonnée de grouper les variables spécifiées comme ...
une fonction d'exemple qui fait la part belle aux variables mais ne les distingue pas par regroupement...
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)
Génial ça fonctionne, mais comment faire la distinction entre les différents hair_color
? Normalement c'est fait à l'intérieur de aes()
mais puisque ceci utilise les résultats de quos()
(i.e. quo_group
) je doit (je pense) être à l'aide de aes_()
au lieu de cela
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
je ne peux pas voir ou avoir lu programmation avec dplyr plusieurs fois maintenant où je vais mal.
quelqu'un Peut-il remarquer mon erreur/me montrer le chemin?
2 réponses
Le nouveau libéré ggplot2 v3.0.0
!!
à l'intérieur aes()
. Avec quelques modifications mineures, votre fonction fonctionne maintenant
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)
créé le 2018-09-12 par le reprex paquet (v0.2.0.9000).
je ne suis pas sûr de comprendre la question. Est-ce à satisfaire les exigences?
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
pile select
variables color
variable(s) répété pour chaque pile. Il utilise également aes_string
, car aes(x=value, color=color)
échoue lorsque color=NULL
.