try関数というのは、エラーがあってもとにかく実行して処理を停止させないための仕組みである。もちろん実行後に改めて停止させることもできる。tryよりも柔軟な処理ができるtryCatchという関数も存在するが、使いやすいtry関数について説明する。try関数の呼び出し方は次の通りである。
try(expr, silent = FALSE)
try関数は、まずexprを評価する。exprによりエラーが発生した場合には、options("show.error.messages")がfalseか、silentがTRUEでない限り、エラーメッセージを吐き出す。関数の返り値はエラーが発生しなければ、評価の結果を返し、エラーが発生した場合にはエラーメッセージを含んだ"try-error"というクラスのオブジェクトを返してくる。次の例をご覧いただきたい。2倍した値を表示しようとしているのだが、-1のときにstopを返すので、最後の2が処理できない状態になっている。
twice <- function(x){ if( x < 0 ) stop("Negative Number") return(2*x) } for(i in c(3:-1,2)){ print(twice(i)) # このままでは最後の2は処理できない }
出力結果
[1] 6 [1] 4 [1] 2 [1] 0 以下にエラー twice(i) : Negative Number
上の場合は途中で止まってしまうが、tryの返したオブジェクトのクラスを参照して、その結果に応じて処理をすることで、最後まで処理できるようにしたのが以下の例である。ループの最後の要素2を2倍した4も得られていることが確認できる。
for(i in c(3:-1,2)){ val <- try(twice(i)) if( class(val) != "try-error" ){ print(val) # stopしないので、2倍の値が入る } }
出力結果
[1] 6 [1] 4 [1] 2 [1] 0 Error in twice(i) : Negative Number [1] 4
0 件のコメント:
コメントを投稿