2017-08-01 34 views
8

दोनों के लिए फ़ंक्शन तर्क पास करें मैं dplyr और ggplot कोड में फ़ंक्शन तर्क को पास करने के तरीके के बारे में उलझन में हूं। मैं dplyr और ggplot2 यहाँ के नवीनतम संस्करण का उपयोग कर रहा मेरे कोड एक barplot (स्पष्टता बनाम मतलब मूल्य)दोनों dplyr और ggplot

diamond.plot<- function (data, group, metric) { 
    group<- quo(group) 
    metric<- quo(metric) 
    data() %>% group_by(!! group) %>% 
      summarise(price=mean(!! metric)) %>% 
      ggplot(aes(x=!! group,y=price))+ 
      geom_bar(stat='identity') 
} 

diamond.plot(diamonds, group='clarity', metric='price') 

त्रुटि का उत्पादन होता है:

Error in UseMethod("group_by_") : no applicable method for 'group_by_' applied to an object of class "packageIQR" 

dplyr के नवीनतम संस्करण के लिए, underscored verbs_() धीरे-धीरे बहिष्कृत है। ऐसा लगता है कि हमें quosures का उपयोग करना चाहिए।

मेरे सवालों का:

  • कोई इस के लिए मौजूदा सबसे अच्छा अभ्यास स्पष्ट कर सकता हूँ?
  • उपरोक्त कोड में क्या गलत था? (कोई अंडरस्कोर dplyr क्रियाएँ कृपया ..)

  • ggplot में, मुझे पता है कि हम aes_string() का उपयोग कर सकते हैं, लेकिन मेरे मामले में, एईएस में पैरामीटर में से केवल एक फ़ंक्शन तर्क से पारित किया जाता है।

अग्रिम धन्यवाद।

उत्तर

6

मुझे नहीं लगता कि आप अभी तक "सही" तरीका कर सकते हैं, क्योंकि ggplot2 tidyeval वाक्यविन्यास का समर्थन नहीं करता है, लेकिन यह आ रहा है।

कोड की dplyr भाग के साथ सबसे अच्छा अभ्यास होगा:

library(tidyverse) 
library(rlang) 

diamond_data <- function (data, group, metric) { 
    quo_group <- enquo(group) 
    quo_metric <- enquo(metric) 
    data %>% 
    group_by(!!quo_group) %>% 
    summarise(price=mean(!!quo_metric)) 
} 
diamond_data(diamonds, clarity, price) 

ggplot2 में tidyeval के समर्थन की कमी को हल करने के लिए, आप (ध्यान दें समारोह में चर के आसपास उद्धरण कर सकता है कॉल):

diamond_plot <- function (data, group, metric) { 
    quo_group <- parse_quosure(group) 
    quo_metric <- parse_quosure(metric) 
    data %>% 
     group_by(!!quo_group) %>% 
     summarise(price=mean(!!quo_metric)) %>% 
     ggplot(aes_(x = as.name(group), y=as.name(metric)))+ 
     geom_bar(stat='identity') 
} 
diamond_plot(diamonds, "clarity", "price") 

संपादित - @ लियोनेल की टिप्पणी के बाद:

diamond_plot <- function (data, group, metric) { 
    quo_group <- sym(group) 
    quo_metric <- sym(metric) 
    data %>% 
     group_by(!!quo_group) %>% 
     summarise(price=mean(!!quo_metric)) %>% 
     ggplot(aes_(x = quo_group, y= quo_metric)) + 
     geom_bar(stat='identity') 
} 
diamond_plot(diamonds, "clarity", "price") 
+0

धन्यवाद – zesla

+0

@sinQueso मैं सिर्फ प्रतीक का प्रयोग करेंगे '()' (या 'as.name()') के बजाय 'parse_quosure की()' उस मामले में। – lionel

+0

सुझाव @lionel के लिए धन्यवाद, मैंने अपना उत्तर – sinQueso

3

sinQueso का जवाब वादा कर रहा है लेकिन यह किसी फ़ंक्शन के उद्देश्य को याद करता है, जो विभिन्न डेटा फ्रेमों के अनुकूल हो सकता है। "कीमत" चर निम्न पंक्ति में समारोह में एन्कोड किया गया है:

summarise(price=mean(!!quo_metric)) %>% 

तो यह समारोह केवल तभी इनपुट चर "मूल्य" है काम करेंगे।

यहाँ एक बेहतर समाधान है कि किसी भी डेटा फ्रेम के लिए इस्तेमाल किया जा सकता है:

diamond_plot <- function (data, group, metric) { 
     quo_group <- sym(group) 
     quo_metric <- sym(metric) 
     summary <- data %>% 
       group_by(!!quo_group) %>% 
       summarise(mean=mean(!!quo_metric)) 
       ggplot(summary, aes_string(x = group, y= "mean")) + 
       geom_bar(stat='identity') 
} 
diamond_plot(diamonds, "clarity", "price") 
3

आप डैनियल समाधान की तुलना में भी आगे जा सकते हैं, जिससे कि (मैट्रिक) सारांश वैरिएबल का नाम इनपुट के साथ बदल जाता है।

diamond_plot <- function(data, group, metric) { 
    quo_group <- rlang::sym(group) 
    quo_metric <- rlang::sym(metric) 
    metric_name <- rlang::sym(stringr::str_c("mean_", metric)) 
    data %>% 
     group_by(!!quo_group) %>% 
     summarize(!!metric_name := mean(!!quo_metric)) %>% 
     ggplot(aes_(x = quo_group, y = metric_name)) + 
     geom_bar(stat = 'identity') 
} 
diamond_plot(diamonds, "clarity", "price") 
0

मेरे लिए इस समस्या का सबसे "tidyeval" जिस तरह से quo_name और aes_string कार्यों के संयोजन के रूप दिखता है। aes_ जैसे पीछे हटने वाले अंडरस्कोर क्रियाओं का उपयोग करने से बचें क्योंकि वे बहिष्कृत हो रहे हैं।

diamond_plot <- function(data, group, metric) { 
    quo_group <- enquo(group) 
    str_group <- quo_name(quo_group) 

    quo_metric <- enquo(metric) 

    summary <- data %>% 
    groupby(!!quo_group) %>% 
    summarise(mean = mean(!!quo_metric)) 

    ggplot(summary) + 
    geom_bar(aes_string(x = str_group, y = "mean"), stat = "identity") 
} 

diamond_plot(diamnonds, clarity, price)