2011-12-28 17 views
5

के लिए आर में एक फ़ंक्शन प्रक्रिया करने के समय को सीमित करना मैं डेटा के वेक्टर को किसी अन्य मान में बदलने के लिए एक फ़ंक्शन ("स्पू" के लिए) लागू करना चाहता हूं। यह फ़ंक्शन डेटा को इनपुट के रूप में लेता है, और वेबपृष्ठों पर फ़ॉर्म सबमिट करने की आवश्यकता होती है। कभी-कभी, यह जल्दी से चला जाता है, और दूसरी बार, यह एक लंबा समय हो सकता है। मैं लूप (या समकक्ष लागू फ़ंक्शन) को ऐसे तरीके से चलाने के लिए चाहता हूं जो बहुत अधिक समय लेते हुए आइटमों पर छोड़ देता है। मैं निम्नलिखित 5 सेकंड के लिए अगले करने के लिए लंघन उपयोग करने से पहले समय पाश चलाता सीमित करने की कोशिश की है:लूप

pb <- txtProgressBar(min = 1, max = 100, style = 3) 
storage <- matrix(nrow = sample.length, ncol = 2) 

for(i in 1:100){ 
    s <- Sys.time() 
    storage[i,] <- try(foo(data.vec[i]), TRUE) 
    if (Sys.time() - s >5) {next} 
    # update progress bar 
    setTxtProgressBar(pb, i) 
} 
close(pb) 

मुझे लगता है कि मैं समझ नहीं किया जाना चाहिए कि कैसे पाश के लिए एक में 'अगले' शर्त लागू करने के लिए। एक स्पष्ट स्पष्टीकरण खोजने के लिए खोज की है, लेकिन यहां कोई भाग्य नहीं मिला है।

+0

आपका foo() समाप्त होने से पहले Sys.time पर वापस नहीं आता है। मैं आपको छोड़ना चाहता हूं, आपको foo फ़ंक्शन में समान कोड जोड़ना होगा; या एक अलग धागे में foo चलाओ, लेकिन यह आसान नहीं है। –

+0

'evalWithTimeout' उदाहरण जाने का तरीका है। अन्यथा: संभवतः वेब फ़ंक्शन (या जो भी) को कॉल करने के लिए आप जिस वास्तविक फ़ंक्शन का उपयोग कर रहे हैं, उसमें अंतर्निहित टाइमआउट तर्क है? यदि आपने पहले से ऐसा नहीं किया है तो दस्तावेज में खुदाई करने योग्य है। –

उत्तर

9

पैकेज R.utils से, tryCatch() के साथ संगीत कार्यक्रम में, एक क्लीनर समाधान प्रदान कर सकता है।

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

require(R.utils) 

for(i in 1:5) { 
    tryCatch(
     expr = { 
      evalWithTimeout({Sys.sleep(i); cat(i, "\n")}, 
          timeout = 3.1) 
      }, 
     TimeoutException = function(ex) cat("Timeout. Skipping.\n") 
    ) 
} 

# 1 
# 2 
# 3 
# Timeout. Skipping. 
# Timeout. Skipping. 

ऊपर कृत्रिम उदाहरण में:

  • evalWithTimeout() को पहला तर्क कोड शामिल प्रत्येक पाश के भीतर मूल्यांकन किया जाना।

  • evalWithTimeout() को timeout तर्क सेकंड में समय सीमा निर्धारित करता है।

  • TimeoutExceptiontryCatch() पर तर्क एक ऐसा कार्य करता है जिसे लूप का पुनरावृत्ति समाप्त होने पर निष्पादित किया जाता है।