Menu
Coddy logo textTech

警告と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
challenge icon

チャレンジ

簡単

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")
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン

自分で練習してみよう: Rオンラインコンパイラ