2017-09-13 11 views
0

Rでシミュレーションを実行しようとしていますが、ここでは系統樹をたくさん作っています。ツリーシミュレーションは、実行時間が非常に変動し、時には0.005秒、場合によっては数分であるため、少し問題になります。遅いツリーを避けたいので、evalWithTimeoutを使用してスキップします。これまでのところ、私は問題を抱えています。なぜなら、ループを強制終了することなく、遅いタスクを殺すことができないからです。 私の問題はthis questionに似ていますが、その質問に対する解決策は私を助けませんでした。遅いタスクをループ内でスキップするR

library(TreeSim) 
library(R.utils) 
for (i in 1:100){ 
    tryCatch(
    expr = { 
     evalWithTimeout(sim.rateshift.taxa(10,1,c(0.5,2),c(0.5,0), 
             c(1,1),c(0,0.5),complete=F), 
     timeout=0.005) 
    }, 
    TimeoutException = function(ex) cat("Timeout. Skipping.\n") 
) 
    print(i) 
} 

これまで私がこれまで行ってきたことです。私は、シミュレーションが期限を過ぎているかどうかに関わらず "i"を印刷し続けたいと思いますが、現在は "CPU時間制限に達しました"というエラーを表示して停止します。

答えて

0

https://www.rdocumentation.org/packages/R.utils/versions/2.5.0/topics/withTimeoutをソースとして使用します。期待どおりに動作するテストユニットがあります。 THCはそれをキャッチするが、スキップするTimeoutExceptionを使用するためには言及して

foo = function() { 
    print("Tic"); 
    x <- ceiling(runif(1) * 100)+1; 
    for (kk in 1:x) { 
     print(kk); 
     Sys.sleep(runif(1)); 
    } 
    print("Tac"); 
} 

bar = function() { 
    for (i in 1:100) { 
    tryCatch({ 
     res <- withTimeout({ 
     foo(); 
    }, timeout=1.08); 
    }, TimeoutException=function(ex) { 
     cat("Timeout. Skipping.\n"); 
     }); 
    print(i); 
    } 
} 

そこで問題は、キャッチされていないsim.rateshift.taxaによって中断によってスローされたエラーがあると、errorを使用適切なタイムアウト

低すぎる時間制限を設定することでの問題もあります:

https://github.com/mhahsler/arules/issues/22

あなたは単にsetTimeLimitを自分で使用することもできますし、ensurはあなたが細かい制御をするように、transientがTRUEに設定されています。

はここで実際にはなく、かなり、TimeoutExceptionがtryCatchによって捕捉された例外はあるhttp://blog.revolutionanalytics.com/2014/10/r-in-production-controlling-runtime.html

system.time(Sys.sleep(5)) 

##user system elapsed 
## 0.000 0.000 5.005 

system.time(local({ 
    setTimeLimit(elapsed = 1, transient = TRUE) 
    Sys.sleep(5) 
})) 

## Error in Sys.sleep(5): reached elapsed time limit 

## Timing stopped at: 0 0 5.006 
+0

この例では完全に動作します。 fooの中で "sim.rateshift.taxa(10,1、c(0.5,2)、c(0.5,0)、c(1,1)、c(0,0.5)、complete = F) )、それはほとんどの時間で動作しますが、タイムアウトの制限に依存します。制限値を小さすぎると、関数は "CPU時間制限に達しました"というエラーで中断します。私はfooを下限でより頻繁にスキップすると思っていたでしょう。 –

+0

あなたが抱えている問題はR.utilsの実装にも関係しています。私は答えを更新しました –

0

これを試してみてください:

library(TreeSim) 
library(R.utils) 
for (i in 1:100){ 
    tryCatch(
    expr = { 
     evalWithTimeout(sim.rateshift.taxa(10,1,c(0.5,2),c(0.5,0), 
             c(1,1),c(0,0.5),complete=F), timeout=0.005) 
    }, error = function(ex) cat("Timeout. Skipping.\n")) 
    print(i) 
} 

を@AhmedMasudコメントで述べているように、関数が別のエラーを投げています。したがって、error = ...を使用すると、他の問題も検出されます。

+0

から取られた例です。実際の例については、https://www.rdocumentation.org/packages/R.utils/withTimeoutを参照してください。 –

+1

ありがとうございますが、元のコードではなく、 'error'を使ってRstudioで動作します。理由は分かりませんが、回答のコードが問題を修正していますので、下の投票を親切に再考してください。 – thc

+0

sim.rateshift.taxaが何か他のエラーを投げているので動作する理由です。 –

関連する問題