2011-05-31 11 views
7

से पहले क्रियाएं निष्पादित नहीं कर रही हैं। मैं एक ऐसा फ़ंक्शन लिख रहा हूं जिसे वेब-आधारित API को पिंग करते समय रेट-सीमित त्रुटि को पकड़ने की आवश्यकता है।Sys.sleep()

मैं tryCatch उपयोग कर रहा हूँ त्रुटि को पकड़ने के लिए, और इस समारोह के अंदर मैं निम्न त्रुटि समारोह निर्दिष्ट करें:

error=function(e) { 
       warning(paste(e,"\nWaiting an hour for rate limit to reset...")) 
       Sys.sleep(3600) # Wait an hour for rate-limit to reset 
       return(user.info(user, ego.count)) 
      } 

समारोह काम करने के लिए प्रकट होता है, लेकिन स्क्रिप्ट के लिए उत्पादन लॉग जाँच जब मुझे लगता है कि नोटिस चेतावनी संदेश तक के बाद लिखा नहीं गया है, नींद का समय समाप्त हो गया है।

मैं साथ आर कंसोल पर इस व्यवहार को पुनः कर सकते हैं:

print("Drew sucks") 
Sys.sleep(10) 

दस सेकंड पहले Drew sucks कंसोल के लिए छपा है गुजरती हैं। मेरे कार्य में, मैं विराम होने से पहले इस लंबे विराम के बारे में उपयोगकर्ता को कुछ प्रतिक्रिया देना चाहता हूं।

इस व्यवहार का कारण क्या है?

उत्तर

3

यह नरक के लिए, कोशिश:

system(sprintf('sleep %d', seconds)) 

मान लिया जाये कि आप रास्ते पर हमेशा की तरह * NIX नींद आदेश मिल गया है।

+1

पर स्टेटेट प्लगइन के माध्यम से एक्लिप्स से अपेक्षित काम करता है एक बात - यदि कोई 'चेतावनी' का उपयोग करता है तो उपयोगकर्ता संदेश दिखाने के लिए 'suppressWarnings' का उपयोग कर सकता है। इस समाधान के साथ एक और तरीका की जरूरत है। – Marek

2

शायद उत्पादन बफरिंग से संबंधित - देख ?flush.console

+0

दूसरी ओर, कंसोल I/o कभी भी buffered नहीं है। आर अपवाद हो सकता है, लेकिन यह एक आश्चर्य होगा, है ना? फिर भी एक और योजना प्रेरणा मैं देखना चाहता हूं (डीएचएच) ... – TheBlastOne

+2

'flush.console()' जोड़ना ऊपर से "ड्रू बेकार" उदाहरण में समस्या को ठीक नहीं करता है। – DrewConway

3

डिफ़ॉल्ट रूप से, चेतावनी तुरंत मुद्रित नहीं कर रहे हैं, इसके बजाय उन्हें शीर्ष स्तर समारोह रिटर्न के बाद बाहर मुद्रित कर रहे हैं। यदि आप इसे तुरंत प्रिंट करना चाहते हैं तो आप '1' पर चेतावनी सेट कर सकते हैं, और यदि आप इसे

+0

हम्म, आपकी पोस्ट को फिर से पढ़ने के बाद, मुझे यकीन नहीं है कि मैं वास्तव में सही प्रश्न का उत्तर दे रहा हूं। मैंने सोचा था कि आप कह रहे थे कि आप चेतावनी() को तत्काल प्रिंट करना चाहते हैं जब इसे कहा जाता है, क्या यह सही है? – geoffjentry

+0

मैं करता हूं, लेकिन यह मुद्दा केवल 'चेतावनी' कॉल पर लागू नहीं होता है, जैसा कि मेरे 'प्रिंट' उदाहरण के साथ है। – DrewConway

+0

यही कारण है कि मुझे लगता है कि मैं आपके प्रश्न को परेशान नहीं कर सकता। यदि मैं आर शुरू करता हूं और अपना प्रिंट उदाहरण चलाता हूं, तो मुझे प्रिंट का आउटपुट मिलता है और फिर देरी होती है। यदि आपके लिए वही काम करना वास्तव में Sys.sleep() से पहले प्रिंट() नहीं करता है, तो कुछ और चल रहा है (उदाहरण के लिए हैडली का जवाब)। मुझे लगता है कि आप किसी भी तरह से किसी भी तरह से काम में w/चेतावनी() मुद्दों में भागने जा रहे हैं। – geoffjentry

7

पर रोकना चाहते हैं तो आपको या तो अपने चेतावनी फ़ंक्शन में immediate.=TRUE सेट करना होगा, या options(warn=1) सेट करना होगा; और को Sys.sleep() कॉल से पहले flush.console() (कुछ ऑपरेटिंग सिस्टम पर) जोड़ने की आवश्यकता हो सकती है।

foo <- function() { 
    warning("uh-oh...", immediate.=TRUE) 
    flush.console() 
    Sys.sleep(5) 
    "done" 
} 
foo() 
# Warning in foo() : uh-oh... 
# [1] "done" 

बारीकियों ?warning के "विवरण" अनुभाग में बाहर से लिखे गए हैं। पैराफ्रेश करने के लिए, "अगर विकल्प (चेतावनी = 0), शीर्ष-स्तरीय फ़ंक्शन पूरा होने के बाद चेतावनियां संग्रहीत और मुद्रित की जाती हैं; यदि विकल्प (चेतावनी = 1) वे होते हैं तो वे मुद्रित होते हैं।"

+0

यह एक ओएस मुद्दा हो सकता है, लेकिन ओएस एक्स पर जो फ़ंक्शन अभी भी चेतावनी प्रिंट करने से पहले 'Sys.sleep' कॉल निष्पादित करता है। – DrewConway

+0

यह विंडोज और उबंटू पर मेरे लिए काम करता है (और उबंटू को 'flush.console() 'की आवश्यकता नहीं है)। –

+0

@DrewConway यह टर्मिनल के माध्यम से ओएसएक्स पर चल रहा है मेरे लिए काम करता है। क्या आप जीयूआई में हैं? (या अधिक विशेष रूप से - कौन सा, यदि ऐसा है) –