2017-08-22 12 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 

यहाँ मैं एक समारोह है कि dataframe और समूहीकरण चर इनपुट के रूप में लेता है लिखना चाहते हैं। आदर्श रूप से, समूहबद्ध करने और एकत्र करने के बाद मैं 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

धन्यवाद! वास्तव में साफ है। क्या आपको बस यह समझाता है कि मुझे 'उद्धरण') 'गिनती' क्यों है, लेकिन मैं 'quo_var' को रख सकता हूं? –

+2

क्योंकि 'aes_q' प्रतीकों की अपेक्षा करता है (या वेरिएबल्स जो प्रतीकों को हल करते हैं)। इस मामले में आप सचमुच केवल 'गिनती' का उपयोग करना चाहते हैं, न कि "गिनती" नामक एक चर है, इसलिए आप इसे उद्धृत करते हैं। लेकिन 'quo_var' एक चर है जिसमें प्रतीक-जैसी अभिव्यक्ति 'समूह' है, इसलिए आपको उस चर का मूल्यांकन करने की आवश्यकता है। – MrFlick

+0

धन्यवाद, मुझे यह स्वीकार करना है कि यह नरक के रूप में भ्रमित है .. इस बारे में थोड़ी देर के लिए विचार करने की आवश्यकता है ...: डी धन्यवाद फिर से !!!! –

संबंधित मुद्दे