プログラムの実行中にエラーが発生すると、プログラムは中断され異常終了される。これに対して、エラーが生じても、処理を続けるように制御することができる(例外処理)。R で例外処理を行うには try
関数あるいは tryCatch
関数を利用する。
try 関数
ある関数 f
を実行し、途中でエラーが発生しても処理を続けたい場合に例外処理を行う。try
関数に f
関数を与えることで、f
関数が実行され、その実行結果が返される。f
関数の処理が正常終了したとき、その結果が返される。一方、異常終了したときは、try-error クラスのオブジェクトが返される。
try
関数の silent
引数に TRUE
を与えると、エラーが発生したときエラーメッセージが出力される。FALSE
を与えると、エラーメッセージの出力は抑制される。
f <- function(x) {
if (x >= 0) {
return (x * x)
} else {
stop("ERROR\n") # x < 0 ならばエラー出力
}
}
g <- function(x) {
y <- NULL
y <- try(f(x), silent = FALSE) # try で f 関数を実行
if (class(y) == "try-error") {
y <- NA # f 関数がエラーになった場合は y に -1 を代入
}
y
}
g(-10)
## Error in f(x) : ERROR
## [1] NA
g(10)
## [1] 100
tryCatch
tryCatch
関数を用いる場合、エラーだけでなく警告も検知でき、それに対して例外処理を行うことができる。
f <- function(x) {
if (x <= 0) {
stop("error!\n") # x が 0 以下ならばエラー
} else if (x %% 2 == 0) {
warning("warning!\n") # x が偶数ならば警告
}
}
g <- function(x) {
y <- 0
tryCatch({
# エラーや警告が発生したときに例外処理を行いたいコード
f(x)
y <- 1
},
error = function(e) { # e にはエラーメッセージが保存されている
message("ERROR!")
message(e)
y <- 2
},
warning = function(e) { # e には警告文が保存されている
message("WARNING!")
message(e)
y <- 3
},
finally = { # ここに書かれるコードは必ず実行される
message("finish.")
y <- 4
},
silent = TRUE
)
return (y)
}
g(-10)
## finish.
## ERROR!
## error!
## [1] 4
g(1)
## finish.
## [1] 4
g(2)
## finish.
## WARNING!
## warning!
## [1] 4