2015-05-08 22 views
8

क्या प्रत्येक चरण में पाइपलाइन के परिणाम को मैन्युअल रूप से किए बिना आउटपुट करने का कोई तरीका है? (उदाहरण के लिए, केवल चुने हुए हिस्सों को चुनने और चलाने के बिना)मध्यवर्ती परिणामों के साथ एक पाइपलाइन के माध्यम से कदम

मुझे अक्सर यह याद रखने के लिए एक पाइपलाइन लाइन-लाइन चलती है कि यह क्या कर रहा था या जब मैं कुछ विश्लेषण विकसित कर रहा हूं।

उदाहरण के लिए:

library(dplyr) 

mtcars %>% 
    group_by(cyl) %>% 
    sample_frac(0.1) %>% 
    summarise(res = mean(mpg)) 
# Source: local data frame [3 x 2] 
# 
# cyl res 
# 1 4 33.9 
# 2 6 18.1 
# 3 8 18.7 

मैं का चयन करें और चलाने के लिए चाहते हैं:

mtcars %>% group_by(cyl) 

और फिर ...

mtcars %>% group_by(cyl) %>% sample_frac(0.1) 

और इतने पर ...

लेकिन चयन और मेंENTER वांछित होने के लिए एक और अधिक कुशल विधि छोड़ देता है।

क्या यह कोड में किया जा सकता है?

है वहाँ एक समारोह जो एक पाइप लाइन और रन लेता/कंसोल में प्रत्येक चरण में उत्पादन दिखा लाइन द्वारा लाइन यह हज़म और आप दबाकर जारी रखने के लिए प्रवेश demos(...) में या पैकेज के examples(...) गाइड की तरह

+0

आर के 'डीबग()' फ़ंक्शन को देखें। यह आप जो चाहते हैं उसके करीब है। आप इसे 'प्रिंट() 'कथन के साथ उपयोग कर सकते हैं। [क्रॉस मान्य] पर यह पोस्ट (http://stats.stackexchange.com/questions/13535/running-an-r-script-line-by-line) इसके बारे में और बात करता है। –

उत्तर

1

यह मैग्रिटर फ़ंक्शन चेन के साथ आसान है। उदाहरण के लिए के साथ एक समारोह my_chain को परिभाषित:

foo <- function(x) x + 1 
bar <- function(x) x + 1 
baz <- function(x) x + 1 
my_chain <- . %>% foo %>% bar %>% baz 

और के रूप में एक श्रृंखला के अंतिम परिणाम प्राप्त:

 > my_chain(0) 
    [1] 3 

आप functions(my_chain) के साथ एक समारोह सूची प्राप्त करते हैं और इस तरह एक "स्टेपर" समारोह को परिभाषित कर सकते :

stepper <- function(fun_chain, x, FUN = print) { 
    f_list <- functions(fun_chain) 
    for(i in seq_along(f_list)) { 
    x <- f_list[[i]](x) 
    FUN(x) 
    } 
    invisible(x) 
} 

और interposed print समारोह के साथ श्रृंखला चलाएँ:

stepper(my_chain, 0, print) 

# [1] 1 
# [1] 2 
# [1] 3 

या उपयोगकर्ता इनपुट के लिए इंतज़ार कर के साथ:

stepper(my_chain, 0, function(x) {print(x); readline()}) 
2

प्रिंट जोड़े :

mtcars %>% 
    group_by(cyl) %>% 
    print %>% 
    sample_frac(0.1) %>% 
    print %>% 
    summarise(res = mean(mpg)) 
+0

मुझे लगता है कि प्रिंट यह तर्क देता है और इसलिए यह काम करता है लेकिन यह हाथों को चुनने और चलाने के बजाए वास्तव में छोटा/तेज़/अधिक सुविधाजनक नहीं है। –

+0

@andrewwong हमें और बताएं, आपको इसे लाइन से लाइन चलाने की आवश्यकता क्यों होगी, और अधिक महत्वपूर्ण बात यह है कि आप प्रिंट आउटपुट को एक-एक करके क्यों देखना चाहते हैं? – zx8754

+1

अद्यतन प्रश्न। मैं कंसोल में एक इंटरैक्टिव स्टेपर या सभी जेनरेटेड इंटरमीडिएट्स के साथ एक ऑटो-जादू मार्कडाउन दस्तावेज़ चाहता हूं। आपके विचारों के लिए धन्यवाद! –

1

IMHO magrittr ज्यादातर उपयोगी सहभागी वह यह है कि जब मैं डेटा की खोज कर रहा हूँ या एक नया फार्मूला/मॉडल बनाने है।

इस मामलों में, अलग चर में मध्यवर्ती परिणाम भंडारण, बहुत समय लगता है और ध्यान भंग होता है, जबकि पाइप मुझे डेटा पर ध्यान केंद्रित है, बल्कि टाइप करने के अलावा करते हैं:

x %>% foo 
## reason on results and 
x %>% foo %>% bar 
## reason on results and 
x %>% foo %>% bar %>% baz 
## etc. 

समस्या यहाँ है कि मैं नहीं जानता कि है अग्रिम में अंतिम पाइप क्या होगा, जैसे @bergant में।@ Zx8754 में के रूप में

टंकण,,

x %>% print %>% foo %>% print %>% bar %>% print %>% baz 

ज्यादा भूमि के ऊपर करने के लिए कहते हैं और मेरे लिए magrittr का पूरा उद्देश्य धरा।

मूलतः magrittr एक सरल ऑपरेटर का अभाव है कि दोनों प्रिंट और पाइप का परिणाम है।
अच्छी खबर यह है कि यह काफी शिल्प के लिए आसान लगता है एक:

`%P>%`=function(lhs, rhs){ print(lhs); lhs %>% rhs } 

अब आप एक पाइप मुद्रित कर सकते हैं:

1:4 %P>% sqrt %P>% sum 
## [1] 1 2 3 4 
## [1] 1.000000 1.414214 1.732051 2.000000 
## [1] 6.146264 

मैंने पाया अगर एक परिभाषित करता है कि/%P>% के लिए एक प्रमुख बाइंडिंग का उपयोग करता है और %>%, प्रोटोटाइप वर्कफ़्लो बहुत सुव्यवस्थित है (Emacs ESS या RStudio देखें)।

3

आप टी-ऑपरेटर (%T>%) और print() का उपयोग कर प्रिंट करने के लिए कौन से परिणाम चुन सकते हैं चुन सकते हैं। टी-ऑपरेटर का उपयोग विशेष रूप से प्रिंटिंग जैसे दुष्प्रभावों के लिए किया जाता है।

# i.e. 
mtcars %>% 
    group_by(cyl) %T>% print() %>% 
    sample_frac(0.1) %T>% print() %>% 
    summarise(res = mean(mpg)) 
संबंधित मुद्दे