입력 검증하기
Coddy R 여정의 논리와 흐름 섹션에 포함된 레슨. 64개 중 55번째.
사용자나 파일에서 입력되는 내용은 텍스트이며 무엇이든 될 수 있습니다. 사용하기 전에 확인하세요. 숫자가 아닌 텍스트에 대해 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 챌린지
쉬움check_signup(name, age, email)을 완성하세요. 모든 문제를 다음 순서대로 수집하세요: (양 끝의 공백을 제거한 후) name is empty, age must be a number, age must be 13 or older(나이가 숫자인 경우에만), 그리고 email needs @입니다. 문제가 없으면 ok를 반환하고, 그렇지 않으면 문제들을 ; 로 결합하여 반환하세요.
제공된 코드는 이름, 나이, 이메일을 (한 줄에 하나씩) 읽고 반환된 값을 출력합니다.
직접 해보기
check_signup <- function(name, age, email) {
# 여기에 코드를 작성하세요
"ok"
}
# 제공된 입력/출력 코드: 그대로 유지하세요
input <- suppressWarnings(readLines(file("stdin")))
cat(check_signup(input[1], input[2], input[3]), sep = "\n")
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
논리와 흐름의 모든 레슨
직접 연습해 보세요: 온라인 R 컴파일러