2017-06-14 42 views
9

Próba napisania stosunkowo prostego opakowania w celu wygenerowania niektórych wykresów, ale nie można ustalić, jak określić uporządkowaną analizę zmiennych grupowania określonych jako ... przykładowa funkcja, która oblicza zmienne, ale nie rozróżnia grup. ..Programowanie oceny tabelarycznej i 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) 

Świetnie się sprawdza, ale jak odróżnić różne hair_color? Zwykle odbywa się to w ciągu aes() ale ponieważ to jest z wykorzystaniem wyników quos() (tj quo_group) mam (chyba) używać aes_() zamiast

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 

nie widzę lub poćwiczyć po przeczytaniu Programming with dplyr kilka razy gdzie idę źle.

Czy ktoś może wskazać mój błąd/pokazać mi drogę?

+0

W swojej drugiej funkcji, dlaczego masz dwie linie z 'ggplot (aes (etc.))? – FlorianGD

+0

Jeśli użyjesz 'quo (...)' zamiast 'quos (...)', wtedy wszystko będzie działać poprawnie w 'aes_' a la' aes_ (~ value, color = quo_group) '. Ale może potrzebujesz listy zmiennych grupujących na coś innego? – aosmith

+1

Och, widzę, 'quos' zwraca listę. Więc jeśli chcesz użyć tylko pierwszego elementu listy 1 elementów, które pochodzą z 'quos (...)', potrzebujesz 'color = quo_group [[1]]' w 'aes_'. – aosmith

Odpowiedz

0

Nie jestem pewien, czy rozumiem pytanie. Czy to spełnia wymagania?

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

używa melt układanie select zmiennych z color zmiennej (ych) powtarza się dla każdego stosu. Używa także aes_string, ponieważ aes(x=value, color=color) kończy się niepowodzeniem, gdy color=NULL.