בדיקות תקפות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-R של Coddy. שיעור 24 מתוך 57.
R בודק טיפוסים; הכללים לגבי ערכים הם באחריותך. הארגומנט validity של setClass() הוא פונקציה של object שמחזירה TRUE כשהאובייקט תקין, או מחרוזת תווים שמתארת את הבעיה. new() מפעילה אותה עבור כל אובייקט:
setClass("Account", slots = c(owner = "character", balance = "numeric"),
validity = function(object) {
if (object@balance < 0) return("balance must not be negative")
TRUE
})
ok <- new("Account", owner = "Ada", balance = 10)
msg <- tryCatch(new("Account", owner = "Bo", balance = -5), error = function(e) conditionMessage(e))
cat(msg)פלט:
invalid class “Account” object: balance must not be negativeפונקציית תקינות יכולה לדווח על כמה בעיות בבת אחת באמצעות החזרת וקטור תווים. R ממספר אותן בהודעת השגיאה:
setClass("Range", slots = c(lo = "numeric", hi = "numeric"),
validity = function(object) {
problems <- character(0)
if (length(object@lo) != 1) problems <- c(problems, "lo must be one number")
if (length(object@hi) != 1) problems <- c(problems, "hi must be one number")
if (length(problems) == 0) TRUE else problems
})
msg <- tryCatch(new("Range", lo = c(1, 2), hi = numeric(0)), error = function(e) conditionMessage(e))
cat(msg)פלט:
invalid class “Range” object: 1: lo must be one number
invalid class “Range” object: 2: hi must be one number@<- בודק את הטיפוס, אך אינו מפעיל את פונקציית התקינות, ולכן השמה יכולה להפר כלל. validObject() מפעילה את הבדיקה שוב; יש לקרוא לה לאחר שינוי משבצות:
setClass("Account", slots = c(balance = "numeric"),
validity = function(object) if (object@balance < 0) "balance must not be negative" else TRUE)
a <- new("Account", balance = 10)
a@balance <- -99
cat("still created:", a@balance, "\n")
msg <- tryCatch(validObject(a), error = function(e) conditionMessage(e))
cat(msg, "\n")פלט:
still created: -99
invalid class “Account” object: balance must not be negative R מצרפת את invalid class “Account” object: לפני הטקסט שלך. קוד שמציג את ההודעה למשתמש יכול להשאיר רק את החלק שמופיע אחרי object: :
setClass("Account", slots = c(balance = "numeric"),
validity = function(object) if (object@balance < 0) "balance must not be negative" else TRUE)
msg <- tryCatch(new("Account", balance = -1), error = function(e) conditionMessage(e))
cat(sub(".*object: ", "", msg))פלט:
balance must not be negativeאתגר
קלהצהר על המחלקה Rating בקובץ Rating.R עם המשבצות stars (מספרי) ו-comment (תו) ופונקציית תקינות שמחזירה את הכלל הראשון שהופר:
stars must be a whole number from 1 to 5כאשר מספר הכוכבים אינו אחד מהמספרים 1, 2, 3, 4, 5;comment is too longכאשר התגובה מכילה יותר מ-20 תווים.
אחרת היא מחזירה TRUE. הקוד שסופק קורא שורות 4;Great (התגובה עשויה להיות חסרה), יוצר כל דירוג ומדפיס ok: 4/5 או את טקסט הבעיה.
הקוד שלך ייכנס ל-Rating.R. הקובץ main.R מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.
נסו בעצמכם
source("Rating.R")
# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, ";")[[1]]
out <- tryCatch({
r <- new("Rating", stars = as.numeric(p[1]), comment = if (length(p) > 1) p[2] else "")
paste0("ok: ", r@stars, "/5")
}, error = function(e) sub(".*object: ", "", conditionMessage(e)))
cat(out, "\n", sep = "")
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות S3
עבודה עם קבציםרשימות עם מחלקהפונקציות בנאימתודות print ו-formatמאמתים ופונקציות עזרחזרה – טמפרטורותתרגלו בעצמכם: קומפיילר R אונליין