2017-06-14 5 views
9

Der Versuch, einen relativ einfachen Wrapper zu schreiben, um einige Plots zu erstellen, kann aber nicht herausfinden, wie sauber Auswertung der Gruppierungsvariablen als ... angegebene Beispiel-Funktion, die Facetten Variablen spezifiziert, aber nicht durch Gruppierung zu unterscheiden. ..Tidy Auswertung Programmierung und ggplot2

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) 

Groß es funktioniert, aber wie zwischen verschiedenen hair_color zu unterscheiden? Normalerweise wird diese innerhalb aes() getan, aber da dies mit den Ergebnissen von quos() (dh quo_group) Ich (glaube ich)

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 

statt aes_() verwenden kann ich nicht sehen, oder trainieren Sie jetzt Programming with dplyr mehrmals gelesen zu haben wo ich falsch liege.

Kann jemand meinen Fehler aufzeigen/mir den Weg zeigen?

+0

In Ihrer zweiten Funktion, warum haben Sie zwei Zeilen mit 'ggplot (aes (etc.))'? – FlorianGD

+0

Wenn Sie 'quo (...)' anstelle von 'quos (...)' verwenden, dann funktionieren die Dinge in 'aes_' a la' aes_ (~ value, color = quo_group) '. Aber vielleicht brauchen Sie eine Liste von Gruppierungsvariablen für etwas anderes? – aosmith

+1

Oh, ich sehe, 'quos' gibt eine Liste zurück. Wenn Sie also nur das erste Element der 1-Element-Liste verwenden möchten, das von 'quos (...)' kommt, benötigen Sie 'color = quo_group [[1]]' in 'aes_'. – aosmith

Antwort

0

Ich bin mir nicht sicher, ob ich die Frage verstehe. Entspricht dies den Anforderungen?

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

Dies verwendet die meltselect Variablen zu stapeln, mit dem color Variable (n) für jeden Stapel wiederholt. Es verwendet auch aes_string, da schlägt fehl, wenn color=NULL.