אימות קלט
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-R של Coddy. שיעור 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 אתגר
קלהשלימו את 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")
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מחרוזות לעומק
תת־מחרוזות עם substr()עיצוב עם sprintf()פיצול וחיבורחיפוש במחרוזותהחלפת טקסטסיכום – בונה שמות משתמש4מטריצות
יצירת מטריצותאינדוקס מטריצותסיכומי שורות ועמודותאריתמטיקה של מטריצותסיכום – תרשים מקומות ישיבה2שליפות לפי מפתח-ערך
שליפת וקטורים לפי שםבדיקת מפתחותהוספה והסרה של מפתחותמעבר בלולאה על שמותחזרה – דלפק המניות11טיפול בשגיאות
העלאת שגיאות באמצעות stop()תפיסת שגיאות באמצעות tryCatch()אזהרות ו-finallyאימות קלטסיכום – מחשבון בטוחתרגלו בעצמכם: קומפיילר R אונליין