2017-06-14 18 views
9

कुछ भूखंडों का उत्पादन करने के लिए अपेक्षाकृत सरल रैपर लिखने की कोशिश कर रहे हैं, लेकिन ... के रूप में निर्दिष्ट समूहिंग चर के साफ-अलग मूल्यांकन को निर्दिष्ट करने के तरीके को कैसे काम नहीं कर सकते हैं, उदाहरण के फ़ंक्शन जो फ़ेसिएबल वैरिएबल हैं लेकिन समूह द्वारा अंतर नहीं करते हैं। ..साफ-सफाई मूल्यांकन प्रोग्रामिंग और 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) 

ग्रेट यह काम करता है, लेकिन कैसे अलग hair_color के बीच अंतर करना? आम तौर पर यह aes() के भीतर किया जाता है, लेकिन aes_() का उपयोग किया बजाय

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 

मैं देख रहा हूँ या बाहर काम नहीं कर सकता इस के बाद से quos() (यानी quo_group) के परिणामों मैं (मुझे लगता है कि) चाहिए उपयोग कर रहा है अब Programming with dplyr कई बार पढ़ा रही जहां मैं गलत जा रहा हूँ।

क्या कोई मेरी त्रुटि को इंगित कर सकता है/मुझे रास्ता दिखा सकता है?

+0

आपके दूसरे फ़ंक्शन में, आपके पास 'ggplot (aes (आदि)) के साथ दो पंक्तियां क्यों हैं? – FlorianGD

+0

यदि आप 'quos (...) 'के बजाय' quo (...) 'का उपयोग करते हैं, तो चीजें' aes_' a la' aes_ (~ value, color = quo_group) 'में ठीक काम करती हैं। लेकिन हो सकता है कि आपको कुछ और के लिए समूहीकरण चर की सूची चाहिए? – aosmith

+1

ओह, मैं देखता हूं, 'quos' एक सूची देता है। इसलिए यदि आप केवल 'तत्व (...)' से प्राप्त 1 तत्व सूची के पहले तत्व का उपयोग करना चाहते हैं, तो आपको 'aes_' में 'color = quo_group [[1]]' की आवश्यकता होगी। – aosmith

उत्तर

0

मुझे यकीन नहीं है कि मैं सवाल समझता हूं। क्या यह आवश्यकताओं को पूरा करता है?

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

यह select चर ढेर melt का उपयोग करता है, color चर (रों) प्रत्येक ढेर के लिए बार-बार के साथ। यह aes_string का भी उपयोग करता है, क्योंकि aes(x=value, color=color)color=NULL विफल रहता है।