2017-12-18 105 views
7

मैं निम्नलिखित डेटा सेट (नमूना) है:purrr का उपयोग कर एक साफ eval समारोह पर लूप कैसे करें?

train <- data.frame(ps_ind_06_bin = c(FALSE, FALSE, FALSE, TRUE, TRUE, FALSE), 
         ps_ind_07_bin = c(FALSE, TRUE, TRUE, FALSE, TRUE, TRUE), 
         ps_ind_08_bin = c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE), 
         ps_ind_09_log = c(1, 3, 4, 2, 3, 2)) 

मैं निम्नलिखित समारोह है कि एक group_by() ऑपरेशन के लिए एक ggplot से पता चलता है:

get_charts1 <- function(mygroup){ 
    quo_var <- enquo(mygroup) 
    train %>% 
    group_by(!!quo_var) %>% 
    count() %>% 
    ungroup() %>% 
    ggplot(aes_q(x = quo_var, y = quote(n), fill = quo_var)) + 
    geom_col() + 
    theme(legend.position = "none") 
    } 

यह ठीक काम करता है जब मैं स्वयं एक स्तंभ नाम imput उदाहरण के लिए:

get_charts1(ps_ind_07_bin) 

हालांकि, मैं कई स्तंभ, जो मैं एक सदिश पर डाल पर समारोह का उपयोग करना चाहते:

binarias <- train %>% 
      select(ends_with("bin")) %>% 
      colnames() 

नक्शे का उपयोग करें और कुछ सुझाव लेने, मैं का उपयोग करने की कोशिश की:

listaplots <- map(quo(!!! syms(binarias)), get_charts1) 

लेकिन यह मुझे निम्न त्रुटि देता है:

"Error: Can't splice at top-level" 

किसी को भी मैं करने के लिए क्या करने की जरूरत पता है इसे काम करने के लिए मिलता है?

+0

लू प्रतीकों का उपयोग करने की आवश्यकता है यह सीधा है केएस की तरह 'नक्शा (quos (ps_ind_06_bin, ps_ind_07_bin), get_charts1)' काम नहीं करता है इसलिए समस्या वास्तव में विस्तार के साथ नहीं है। 'नक्शा() 'की तरह लगता है सिर्फ पैरामीटर के मूल्यांकन को मजबूर कर रहा है। – MrFlick

+0

मजबूर वस्तुओं (जबरदस्त quosures या प्रतीकों सहित) कैप्चरिंग अगले rlang संस्करण में बॉक्स से बाहर काम करेगा। यह unquoting के बराबर होगा। – lionel

+0

[जब कोई मेरे प्रश्न का उत्तर देता है तो मुझे क्या करना चाहिए?] (Https://stackoverflow.com/help/someone-answers) – zx8754

उत्तर

2

map की बजाय, मुझे लगता है कि आप यहां invoke_map चाहते हैं। यह तुम क्या चाहते

listaplots <- invoke_map(get_charts1, rlang::syms(binarias)) 

map() जबकि invoke_map नहीं है मानकों के मूल्यांकन के लिए मजबूर करने लगता देने के लिए लगता है।

1

बदलें enquo()sym() और अपने कोड इस तरह ठीक काम करता है:

get_charts1 <- function(mygroup){ 
    quo_var <- sym(mygroup) # <- HERE 

    train %>% 
     group_by(!!quo_var) %>% 
     count() %>% 
     ungroup() %>% 
     ggplot(aes_q(x = quo_var, y = quote(n), fill = quo_var)) + 
     geom_col() + 
     theme(legend.position = "none") 
} 

binarias <- train %>% select(ends_with("bin")) %>% colnames() 

binarias %>% map(get_charts1) 
9

मैं (आप बहुत करीब थे, लेकिन जरूरत संकुल लोड करने के लिए भूल गया) एक reprex बनाने के द्वारा शुरू करने के लिए जा रहा हूँ, और एक सुसंगत प्रारूप के लिए फिर से शैली styler का उपयोग कर:

library(tidyverse) 
library(rlang) 

train <- data.frame(
    ps_ind_06_bin = c(FALSE, FALSE, FALSE, TRUE, TRUE, FALSE), 
    ps_ind_07_bin = c(FALSE, TRUE, TRUE, FALSE, TRUE, TRUE), 
    ps_ind_08_bin = c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE), 
    ps_ind_09_log = c(1, 3, 4, 2, 3, 2) 
) 

get_charts <- function(mygroup) { 
    quo_var <- enquo(mygroup) 
    train %>% 
    group_by(!! quo_var) %>% 
    count() %>% 
    ungroup() %>% 
    ggplot(aes_q(x = quo_var, y = quote(n), fill = quo_var)) + 
    geom_col() + 
    theme(legend.position = "none") 
} 

आप इस तरह कोड की पीढ़ी स्वचालित करना चाहते हैं:

get_charts(ps_ind_06_bin) 
get_charts(ps_ind_07_bin) 
get_charts(ps_ind_08_bin) 

इसके लिए या तो लूप या लागू/मानचित्र फ़ंक्शन की आवश्यकता होगी। एक map() अच्छी तरह से यहां काम करता है के बाद से हम ggplot2 वस्तुओं वापस जाने के लिए चाहते हैं, और कर के साथ कि पाश के लिए एक कुछ और बुनियादी ढांचे की आवश्यकता है।एक बार आप याद रखें कि आप यहाँ, नहीं कच्चे तार

vars <- train %>% select(ends_with("bin")) %>% colnames() 

vars %>% 
    syms() %>% 
    map(function(var) get_charts(!!var)) 

## [[1]] 

## 
## [[2]] 

## 
## [[3]] 

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