2017-08-22 49 views
8

Rozważmy Ten prosty przykładjak połączyć ggplot i dplyr w funkcję?

library(dplyr) 
library(ggplot2) 

dataframe <- data_frame(id = c(1,2,3,4), 
         group = c('a','b','c','c'), 
         value = c(200,400,120,300)) 

# A tibble: 4 x 3 
    id group value 
    <dbl> <chr> <dbl> 
1  1  a 200 
2  2  b 400 
3  3  c 120 
4  4  c 300 

Tutaj chcę napisać funkcję, która bierze dataframe i grupowania zmienna jako wejście. Idealnie, po grupowaniu i agregowaniu chciałbym wydrukować wykres ggpplot.

to działa:

get_charts2 <- function(data, mygroup){ 

    quo_var <- enquo(mygroup) 

    df_agg <- data %>% 
    group_by(!!quo_var) %>% 
    summarize(mean = mean(value, na.rm = TRUE), 
       count = n()) %>% 
    ungroup() 

    df_agg 
} 



> get_charts2(dataframe, group) 
# A tibble: 3 x 3 
    group mean count 
    <chr> <dbl> <int> 
1  a 200  1 
2  b 400  1 
3  c 210  2 

Niestety, dodając ggplot do funkcji powyżej NIE

get_charts1 <- function(data, mygroup){ 

    quo_var <- enquo(mygroup) 

    df_agg <- data %>% 
    group_by(!!quo_var) %>% 
    summarize(mean = mean(value, na.rm = TRUE), 
       count = n()) %>% 
    ungroup() 

    ggplot(df_agg, aes(x = count, y = mean, color = !!quo_var, group = !!quo_var)) + 
    geom_point() + 
    geom_line() 
} 


> get_charts1(dataframe, group) 
Error in !quo_var : invalid argument type 

ja nie rozumiem, co tu jest nie tak. Jakieś pomysły? Dzięki!

EDIT: ciekawa kontynuacja tutaj how to create factor variables from quosures in functions using ggplot and dplyr?

+0

cholera !!! czy wiesz, jak mogę poprawić mój kod powyżej? dzięki!! –

Odpowiedz

10

ggplot nie obsługuje jeszcze porządek składni eval (nie można używać !!). Musisz użyć bardziej tradycyjnych standardowych wywołań ewaluacyjnych. Możesz użyć aes_q w ggplot, aby pomóc w tym.

get_charts1 <- function(data, mygroup){ 

    quo_var <- enquo(mygroup) 

    df_agg <- data %>% 
    group_by(!!quo_var) %>% 
    summarize(mean = mean(value, na.rm = TRUE), 
       count = n()) %>% 
    ungroup() 

    ggplot(df_agg, aes_q(x = quote(count), y = quote(mean), color = quo_var, group = quo_var)) + 
    geom_point() + 
    geom_line() 
} 


get_charts1(dataframe, group) 
+0

dzięki! naprawdę schludny. Czy po prostu wyjaśniasz, dlaczego potrzebuję 'quote()' 'count', ale mogę zachować' quo_var' jak jest? –

+2

Ponieważ 'aes_q' oczekuje symboli (lub zmiennych, które odpowiadają symbolom). W tym przypadku chcesz dosłownie po prostu użyć 'count', a nie zmiennej o nazwie" count ", więc ją zacytuj. Ale 'quo_var' jest zmienną zawierającą symboliczne wyrażenie' group', więc musisz ocenić tę zmienną. – MrFlick

+0

dziękuję, muszę przyznać, że to jest mylące jak cholera .. Muszę się nad tym zastanowić przez chwilę ...: D dzięki znowu !!!! –