2013-11-15 11 views
8

पर खंड कोड आउटपुट रीडायरेक्ट करें मैं एक बुनाई फ़ाइल में एम्बेडेड कुछ सुंदर लंबी समांतर कंप्यूटेशंस की निगरानी करना चाहता हूं।Knitr: टर्मिनल

संगणना एक पैकेज मैं लिखा है पर भरोसा करते हैं, और प्रासंगिक समारोह में चलाना के लिए मल्टीकोर पैकेज से mclapply उपयोग करता है। यह फ़ंक्शन utils पैकेज से txtProgressBar के थोड़ा संशोधित कार्यान्वयन का उपयोग करके गणनाओं की प्रगति की निगरानी करने के लिए प्रगति सलाखों को आउटपुट करता है। प्रगति पट्टी टर्मिनल पर मुद्रित होती है और प्रत्येक बार mclapply का पुनरावृत्ति पूर्ण होने पर एक फीफो कनेक्शन के माध्यम से अपडेट किया जाता है।

यह फ़ाइल से सोर्सिंग या सीधे फ़ंक्शन को कॉल करते समय ठीक काम करता है, लेकिन मुझे यह knitr के भीतर काम करने के लिए कोई रास्ता नहीं मिलता है। मैंने प्रासंगिक खंड विकल्पों का प्रयास किया है, मैं टर्मिनल पर रीडायरेक्ट किए गए संदेश और चेतावनियां प्राप्त कर सकता हूं, लेकिन प्रगति पट्टी नहीं। क्या कोई मदद कर सकता है?

कम से कम काम करने वाला उदाहरण प्रदान करने के लिए खेद है, लेकिन मुझे नहीं लगता कि मैं इस सेटिंग में कैसे एक बना सकता हूं।

उत्तर

6

क्योंकि txtProgressBar() stdout को लिखता है, और knitr stdout में सबकुछ कैप्चर करता है, इसलिए वर्तमान में टेक्स्ट-आधारित होने पर और आपकी स्टडआउट को लिखना आसान नहीं है। शायद मैं जो चाहता हूं उसे प्राप्त करने के लिए आंतरिक रूप से evaluate::evaluate(debug = TRUE) का उपयोग कर सकता हूं, लेकिन मुझे पूरी तरह से यकीन नहीं है कि यह टेक्स्ट प्रगति पट्टी के साथ अच्छी तरह से काम करता है।

क्षण में मेरे सुझाव हैं:

  • उपयोग tcltk::tkProgressBar()
  • की तरह एक जीयूआई आधारित प्रगति बार अन्य स्थानों पर, उदाहरण के लिए करने के लिए प्रगति बारे में (Ab) stderr

    ```{r progress} 
    pb = txtProgressBar(min = 0, max = 100, file = stderr()) 
    for (i in 1:100) { 
        setTxtProgressBar(pb, i) 
        Sys.sleep(0.05) 
    } 
    close(pb) 
    ``` 
    
  • या एक कोड हिस्सा बाहर अपने कार्य का उपयोग करता है, उदा का उपयोग कर एक इनलाइन अभिव्यक्ति में, (जैसे RNW में \Sexpr{my_multicore_function()} या `r my_cool_fun()` आरएमडी के रूप में) इनलाइन मूल्यांकन प्रगति बार मुद्रण Yihui के जवाब में stderr करने के बारे में बात stdout

+0

उत्तर @Yihui के लिए धन्यवाद, मैं उम्मीद कर रहा था कि आप छोड़ देंगे! मैं आपके पहले सुझाव की रेखा के साथ कुछ कोशिश करूंगा, दूसरा एक कम्प्यूटेशंस को कैश करने की क्षमता को खोने का संकेत देगा। मल्टीकोर मुद्दे अलग-अलग हैं, क्या आप किसी हिस्से में आयोजित गणनाओं की स्थिति की निगरानी करने के किसी भी तरीके से अवगत हैं? –

+1

शायद आप अन्य स्थानों पर प्रगति लिख सकते हैं, जैसे फ़ाइल में: 'txtProgressBar (..., file =' progress_temp.txt ') '। या इसे stderr के लिए लिखें। मैं अपना जवाब अपडेट करूंगा। –

+0

'StdErr()' हैक के लिए धन्यवाद, लागू करने के लिए सरल और अद्भुत काम करता है। जबकि मैं इसमें हूं, knitr के लिए धन्यवाद यह एक शानदार उपकरण है जिसे मैं दैनिक उपयोग करता हूं। –

0

पढ़ चुके कब्जा नहीं है, क्योंकि मैं करने के लिए stdout पुनः निर्देशित अस्थायी सुझाव है stderrsink() के साथ।

sink(stderr()) 

your_code() 

sink()