2017-08-22 28 views
8

考慮這個簡單的例子如何將ggplot和dplyr合併爲一個函數?

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 

在這裏,我想要寫一個函數,數據框和分組變量作爲輸入。理想情況下,經過分組和彙總後,我想打印一張ggpplot圖表。

這工作:

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 

不幸的是,加入ggplot成以上函數失敗

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 

我不明白什麼是錯在這裏。有任何想法嗎? 謝謝!

編輯:有趣的後續這裏how to create factor variables from quosures in functions using ggplot and dplyr?

+0

該死!你知道我該如何修復我的代碼然後?謝謝!! –

回答

10

ggplot還不支持整潔的eval語法(你不能使用!!)。您需要使用更傳統的標準評估電話。您可以在ggplot中使用aes_q來解決這個問題。

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

謝謝!真的很整齊。你介意解釋爲什麼我需要引用()''count',但我可以保持'quo_var'原樣? –

+2

因爲'aes_q'需要符號(或解析爲符號的變量)。在這種情況下,您希望從字面上只使用'count',而不是名爲「count」的變量,以便引用它。但'quo_var'是一個包含類似符號表達式'group'的變量,因此您需要評估該變量。 – MrFlick

+0

謝謝,我不得不承認這是令人困惑的地獄..需要思考這一段時間......:D再次感謝!!!! –

相關問題