とげまる日記

九州の大学で数学の博士課程に通ってます。自分の日記として使っています。

Rのfor文でエラーが出ても処理を止めない方法

Rのfor文を回していると、途中でエラーが出て止まってしまいました。

その解決策としてエラーが出てもとりあえず最後まで回してくれるtry関数を紹介します。

以下のコードは10次元ベクトル a,bの成分をlog (rnorm(1,0,1))で生成。

log(rnorm(1,0,1))を計算する際、rnorm(1,0,1) N(0,1)からのランダムサンプルであるためエラーを返すことがある。

以下ではエラーで止まることをtry関数で防ぎ、while関数でそれぞれ10個ずつ生成できるようにコードを書いた。

L <- 10
a <- numeric(L)
b <- numeric(L)
l <- 1

while(l <= L){
  try(a[l] <- log(rnorm(1,0,1)))
  if(class(a[l]) == "try-error"){
    a[l] <- NA
  }
  try(b[l] <- log(rnorm(1,0,1)))
  if(class(b[l]) == "try-error"){
    b[l] <- NA
  }
  if(is.na(a[l]) | is.na(b[l])){
    l <- l-1
  }
  l <- l+1
}
a
b

実行結果は以下のとおり。それぞれ10個正しく生成できました。

[1]  0.3591358  0.1832536 -3.6249145 -0.4584207  0.1969482 -1.8525264 -1.3818560 -1.3684374 -0.9294030 -2.8535764
 [1] -0.54935989 -0.45241981 -0.31944820  0.02388071 -1.25626751 -1.55962373 -1.34217871 -3.33795157 -3.33510165
[10] -0.52030770

お役に立てれば幸いです。