tryCatch()で捕捉する
CoddyのRジャーニー「ロジックとフロー」セクションの一部。レッスン 53/64。
tryCatch(expr, error = function(e) ...) は expr を実行します。エラーが発生した場合は、代わりにハンドラーが実行され、その値が結果になります。その後もスクリプトの実行は続行されます。
safe_sqrt <- function(x) {
tryCatch(sqrt(x), error = function(e) NA)
}
print(safe_sqrt(16))
print(safe_sqrt("a"))
print("still running")出力:
[1] 4
[1] NA
[1] "still running"ハンドラーはエラーをeとして受け取り、conditionMessage(e)はそのメッセージテキストを返します:
result <- tryCatch(
stop("file not found"),
error = function(e) paste("Problem:", conditionMessage(e))
)
print(result)出力:
[1] "Problem: file not found"失敗する可能性のある呼び出しだけをラップし、デフォルト値やユーザー向けのメッセージなど、役立つ処理ができる場所で捕捉します。
to_number <- function(s) {
tryCatch({
if (s == "") stop("empty input")
as.integer(s)
}, error = function(e) -1L)
}
print(to_number("42"))
print(to_number(""))出力:
[1] 42
[1] -1ループ内では、tryCatch() によって、他の項目の処理を続けながら、1つの不正な項目だけを失敗させることができます。
inputs <- list(4, "x", 9)
for (v in inputs) {
r <- tryCatch(sqrt(v), error = function(e) "not a number")
cat(format(v), "->", r, "\n")
}出力:
4 -> 2
x -> not a number
9 -> 3 チャレンジ
簡単safe_divide(a, b)を完成させてください。tryCatch()を使用し、その中でbが0の場合はdivision by zeroエラーを発生させ、それ以外の場合はa / bを計算します。ハンドラーは、Error: に続けてメッセージを返します。結果は小数点以下2桁に丸めたテキスト(3.33)またはエラーテキストとして返してください。
用意されたコードは、カンマで区切られた10/3のような数値のペアを読み取り、各ペアの結果をそれぞれ別の行に出力します。
自分で試してみよう
safe_divide <- function(a, b) {
# ここにコードを書いてください
""
}
# 提供された入力/出力コード:そのままにしておいてください
input <- suppressWarnings(readLines(file("stdin")))
for (pair in strsplit(input[1], ",")[[1]]) {
p <- as.numeric(strsplit(pair, "/")[[1]])
cat(safe_divide(p[1], p[2]), "\n", sep = "")
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Rオンラインコンパイラ