आर

2011-01-21 7 views
28

में एक स्टेटस संदेश दिखा रहा है, मैं एक ऐसा फ़ंक्शन लिखना चाहता हूं जो उपयोगकर्ता को एक स्टेटस संदेश प्रस्तुत करता है जो समय, प्रतिशत पूर्ण और प्रक्रिया की वर्तमान स्थिति को दिखाता है। मैं संदेश को इकट्ठा करने में संभाल सकता हूं, लेकिन मैं सिर्फ कंसोल पर प्रिंट करने के अलावा कुछ और करना चाहता हूं और इसे स्क्रॉल कर दूंगा, एक संदेश के बाद एक संदेश। मुझे वास्तव में message() और बिना किसी ग्राफिक्स के स्क्रोल किए बिना संदेश को बदलना अच्छा लगेगा। आर के साथ यह संभव है?आर

+10

"यह आर है कोई है यदि। केवल कैसे।" - सिमॉन ब्लोमबर्ग –

उत्तर

24

इस तरह कुछ कैसे?

for(i in 1:10) { 
    Sys.sleep(0.2) 
    # Dirk says using cat() like this is naughty ;-) 
    #cat(i,"\r") 
    # So you can use message() like this, thanks to Sharpie's 
    # comment to use appendLF=FALSE. 
    message(i,"\r",appendLF=FALSE) 
    flush.console() 
} 
+6

'बिल्ली()' का उपयोग न करें, 'संदेश() '(जिसे दबाया जा सकता है) का उपयोग करें, उदाहरण के लिए आज आर-ब्लॉगर पोस्ट पर चर्चा की गई है जो' बिल्ली()' के साथ पकड़ को बहस कर रही है। –

+1

@Dirk: इसे 'संदेश (..., appendLF = FALSE) होना चाहिए --- अन्यथा स्क्रॉलिंग संदेश कंसोल पर दिखाई देंगे जो ओपी विशेष रूप से टालना चाहता था। – Sharpie

+0

@ आईडीक ('' 'के साथ 'cat()' को बदलकर' डिस्क 'प्रत्येक अपडेट के साथ एक नई लाइन जोड़ता है। क्या आपको नई लाइन को रोकने के लिए कुछ अतिरिक्त करना है? एफडब्ल्यूआईडब्लू, 'txt प्रोग्रेसबार' 'बिल्ली()' का उपयोग करता है। –

7

ऐसा करने के और अधिक सुरुचिपूर्ण तरीके हो सकते हैं, लेकिन यह यह कर सकता है:

test.message <- function() { 
    for (i in 1:9){ 
    cat(i) 
    Sys.sleep(1) 
    cat("\b") 
    } 

} 

आप स्वचालित रूप से अपने संदेश जेनरेट कर रहे हैं, तो आप कितने \ b वर्ण की गणना करने की आवश्यकता होगी सही राशि का बैक अप लेने के लिए आउटपुट करने के लिए, लेकिन यह बहुत सरल है।

17

utils पैकेज में txtProgressBar और इसे अद्यतन करने के लिए कार्य शामिल हैं जिनका उपयोग प्रक्रिया को पूरा करने के प्रतिशत को दिखाने के लिए किया जा सकता है।

up1, up2 और up3 कार्यों कैसे अपडेट सांत्वना स्क्रॉल किए बिना नियंत्रित किया जाता है के उदाहरण के लिए txtProgressBar करने के लिए एक कॉल के दौरान बनाए गए देखें।

+2

यह शानदार है! आप अपना खुद का अपडेट फ़ंक्शन भी बना सकते हैं और सेट कर सकते हैं: 'tpb <- txtProgressBar (...); myUpFun <- फ़ंक्शन (मान) {...}; टीपीबी $ ऊपर <- myUpFun'। फिर आप 'संदेश()' का उपयोग करके एक अपडेट फ़ंक्शन लिख सकते हैं, इसलिए Dirk शोर को दबा सकता है। ;-) –

+0

@ जोशुआ: अच्छा अवलोकन! जब मैं एक कस्टम अपडेट फ़ंक्शन बनाने पर विचार कर रहा था, तो मैं इसे लागू करने के लिए 'txtProgressBar()' की प्रतिलिपि बनाने और पुनः लिखने की कल्पना कर रहा था। – Sharpie

+0

'plyr :: progress_text' भी है। यह 'txtProgressBar' के लिए एक साधारण रैपर है, हालांकि ... – aL3xa

15

यहां कुछ ब्लिंग ब्लिंग है। ?tcltk::tkProgressBar से।

pb <- tkProgressBar("test progress bar", "Some information in %", 
     0, 100, 50) 
Sys.sleep(0.5) 
u <- c(0, sort(runif(20, 0 ,100)), 100) 
for(i in u) { 
    Sys.sleep(0.1) 
    info <- sprintf("%d%% done", round(i)) 
    setTkProgressBar(pb, i, sprintf("test (%s)", info), info) 
} 
Sys.sleep(5) 
close(pb) 

alt text

+1

जो पूर्णता के लिए वास्तव में अच्छा है, लेकिन मेरी वर्तमान आवश्यकता केवल पाठ के समाधान के लिए है। –

+2

मैंने tcltk पॉप अप होने पर अंत में अपना प्रश्न नहीं पढ़ा। यह एक आवेग जवाब था, जिसके लिए मैं क्षमा चाहता हूं। शायद आपको भविष्य से कुछ दिन इसकी आवश्यकता होगी। –

+0

+1 शानदार। यह मुझे टीसीटीटीके के बारे में कुछ सीखने के लिए भी प्रेरित करता है। – Iterator