2

シミュレーションに使用している複雑で長い関数があります。これはエラーを生成する可能性があり、ほとんどの場合、分散がゼロの等しい値で終わるランダムベクトルに関係し、PCAまたはロジスティック回帰のいずれかに供給されます。

doMCとを使用してクラスター上で実行していますplyrtryCatchエラーの可能性が多く、それぞれの確率が小さいため、関数内のすべての小さなことをしたくありません。

tryCatchすべての小さな行を実行するのではなく、実行ごとにtryCatchを実行するにはどうすればよいですか?コードは次のようなものです。

iteration = function(){
    a really long simulation function where errors can happen
    }
reps = 10000
results = llply(1:reps, function(idx){out<-iteration()},.parallel=TRUE)

約1年後に編集: パッケージforeachにより、これは以前よりも大幅に簡単になりますplyr

library(foreach)
output <- foreach(i=1:reps, .errorhandling = 'remove')%dopar%{
  function
}
4

2 に答える 2

2

llplyに渡す関数でtrycatchループをラップできますか?

results = llply(1:reps, function(idx){
    out = NA
    try({ 
        out<-iteration()
    }, silent=T)
    out
},.parallel=TRUE)
于 2013-02-25T20:00:15.163 に答える
0

tryCatch関数の反復を自分の中に入れることができます。次に例を示します。

iteration <- function(idx){
  tryCatch(
    { idx <- idx+1
      ## very long treatments here...
      ## I add a dummy error here to test my tryCatch
      if(idx %% 2000 ==0) stop("too many iterations")
    },error = function(e) print(paste('error',idx)))
}

今それを内でテストしますllply

library(plyr)
reps = 10000
results = llply(1:reps, iteration,.parallel=TRUE)
1] "error 2000"
[1] "error 4000"
[1] "error 6000"
[1] "error 8000"
[1] "error 10000"
于 2013-02-25T20:20:54.393 に答える