警告とfinally
CoddyのRジャーニー「ロジックとフロー」セクションの一部。レッスン 54/64。
警告は、処理を停止せずに問題を報告します。関数は値を返し、R は最後に警告を出力します。as.numeric()は、数値ではないテキストに対して警告を出し、NAを返します。
x <- as.numeric("abc")
print(x)出力:
[1] NA
Warning message:
NAs introduced by coercion エラーと同様に、警告はエラーストリームに送られるため、Coddyではテストが失敗します。自分で結果を確認するときはsuppressWarnings()で警告を抑制でき、tryCatch(..., warning = )で警告を値に変換できます。
x <- suppressWarnings(as.numeric("abc"))
print(is.na(x))
r <- tryCatch(as.numeric("abc"), warning = function(w) paste("warned:", conditionMessage(w)))
print(r)出力:
[1] TRUE
[1] "warned: NAs introduced by coercion"warning("message")は、自分のコードから警告を発生させます。警告のハンドラーは、エラーのハンドラーと同じように機能します。
ratio <- function(a, b) {
if (b == 0) warning("b is zero, returning Inf")
a / b
}
r <- tryCatch(ratio(1, 0), warning = function(w) conditionMessage(w))
print(r)出力:
[1] "b is zero, returning Inf"finally = ... は、エラーが発生したかどうかにかかわらず、式と任意のハンドラーの後に実行されます。終了メッセージなど、必ず実行しなければならない処理に使用します。
load <- function(x) {
tryCatch({
if (x < 0) stop("negative")
x * 10
}, error = function(e) NA,
finally = cat("finished", x, "\n"))
}
print(load(2))
print(load(-1))出力:
finished 2
[1] 20
finished -1
[1] NAチャレンジ
簡単to_numbers(texts)を完成させてください。各テキストを数値に変換します。変換できない値は警告を出力せずにNAになります。2行を返してください。1行目は変換後の数値をスペースで結合したNumbers: (NAの値も含む)、2行目は変換に失敗した値の数を示すInvalid: です。
提供されたコードは、テキストをカンマ区切りの行として読み込み、返された各行を出力します。
自分で試してみよう
to_numbers <- function(texts) {
# ここにコードを書いてください
c("Numbers: ", "Invalid: 0")
}
# 提供された入力/出力コード:そのままにしておいてください
input <- suppressWarnings(readLines(file("stdin")))
cat(to_numbers(strsplit(input[1], ",")[[1]]), sep = "\n")
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Rオンラインコンパイラ