2011-12-28 11 views
5

データのベクトルを別の値に変換する関数(この説明では「foo」)を適用したいとします。この関数はデータを入力として受け取り、Webページにフォームを送信する必要があります。時々、これはすぐに、そして他の時には、それは長い時間がかかることがあります。私はあまりにも時間がかかる項目をスキップする方法でforループ(または同等の適用機能)を実行したいと思います。私は、次を使用して5秒の隣にスキップする前にループが実行される時間を制限することを試みた:R forループ内で関数が処理する時間を制限する

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) 

私はforループの中で、「次へ」の条件を適用する方法を理解してはならないことだと思います。より明確な説明を見つけるために検索しましたが、ここで運が得られません。

+0

foo()は終了する前にSys.timeに戻りません。私はスキップを達成したい、あなたはfoo関数で同様のコードを追加する必要があります。別のスレッドでfooを実行することもできますが、それは簡単ではありません。 –

+0

'evalWithTimeout'の例があります。それ以外の場合:おそらく、実際にWebページを呼び出すために使用している関数(または何でも)に組み込みのタイムアウト引数がありますか?あなたがまだそれをしていない場合は、ドキュメントを掘り起こすほど価値があります。 –

答えて

9

evalWithTimeout()パッケージ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()の最初の引数は、各ループ内で評価するためのコードを含んでいます。

  • timeoutの引数がevalWithTimeout()の場合、制限時間は秒で設定されます。

  • tryCatch()への引数は、ループの繰り返しがタイムアウトしたときに実行される関数をとります。

関連する問題