Menu
Coddy logo textTech

入力を検証する

CoddyのRジャーニー「ロジックとフロー」セクションの一部。レッスン 55/64。

ユーザーやファイルからの入力はテキストであり、どのような内容でもあり得ます。使用する前に確認しましょう:suppressWarnings(as.numeric(s))は数値でないテキストに対してNAを返し、is.na()はそれをテストします:

read_age <- function(s) {
  n <- suppressWarnings(as.numeric(s))
  if (is.na(n)) return("not a number")
  if (n < 0 || n > 130) return("out of range")
  paste("age", n)
}
print(read_age("36"))
print(read_age("abc"))
print(read_age("200"))

出力:

[1] "age 36"
[1] "not a number"
[1] "out of range"

バリデーターは最初の問題で停止する代わりに、すべての問題を収集できるため、より有用なフィードバックが得られます。ここではメッセージのベクトルを返し、入力に問題がなければ空になります。

check_password <- function(p) {
  problems <- c()
  if (nchar(p) < 8) problems <- c(problems, "too short")
  if (!grepl("[0-9]", p)) problems <- c(problems, "needs a digit")
  problems
}
print(check_password("abc"))
print(length(check_password("secret123")))

出力:

[1] "too short"     "needs a digit"
[1] 0

関数を呼び出す側に応じてスタイルを選びます。呼び出し側が不正な入力を想定しており、それをユーザーに表示する場合はメッセージを返します。不正な入力が見過ごしてはならないバグを意味する場合は、stop() でエラーを発生させます。

# 呼び出し側は不正な入力を想定し、メッセージを表示する
read_age("abc")                     # "not a number"
# 不正な入力はプログラム内の誤りである
if (!is.numeric(x)) stop("x must be numeric")

解析ステップをtryCatch()で囲んで検証すると、メインコードからチェックをなくせます。各レコードは変換されるか、エラーとして報告されます。

parse_record <- function(line) {
  parts <- strsplit(line, ",")[[1]]
  if (length(parts) != 2) stop("expected 2 fields")
  qty <- suppressWarnings(as.integer(parts[2]))
  if (is.na(qty)) stop("quantity is not a whole number")
  list(item = parts[1], qty = qty)
}
for (line in c("tea,2", "jam", "oil,x")) {
  r <- tryCatch(parse_record(line), error = function(e) conditionMessage(e))
  cat(line, ":", if (is.list(r)) paste("ok", r$qty) else r, "\n")
}

出力:

tea,2 : ok 2 
jam : expected 2 fields 
oil,x : quantity is not a whole number 
challenge icon

チャレンジ

簡単

check_signup(name, age, email)を完成させてください。すべての問題を次の順序で収集します:name is empty(両端の空白を削除した後)、age must be a number、age must be 13 or older(年齢が数値の場合のみ)、email needs @。問題がない場合はokを返し、それ以外の場合は問題を; で結合して返します。

提供されたコードは、名前、年齢、メールアドレスを(1行に1つずつ)読み取り、返された値を出力します。

自分で試してみよう

check_signup <- function(name, age, email) {
  # ここにコードを書いてください
  "ok"
}

# 提供された入出力コード:そのままにしておいてください
input <- suppressWarnings(readLines(file("stdin")))
cat(check_signup(input[1], input[2], input[3]), sep = "\n")
quiz icon腕試し

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

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

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