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?

12
demandé sur Tung 2017-06-14 18:23:32

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).

1
répondu Tung 2018-09-12 13:28:13

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.

0
répondu dnlbrky 2018-02-08 04:03:32