משבצות וגישה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-R של Coddy. שיעור 23 מתוך 57.
obj@slot <- value משנה משבצת. כמו אובייקטי S3, אובייקטי S4 הם ערכים: פונקציה שמשנה אחד מהם פועלת על עותק משלה ומחזירה אותו:
setClass("Person", slots = c(name = "character", age = "numeric"))
birthday <- function(p) {
p@age <- p@age + 1
p
}
ada <- new("Person", name = "Ada", age = 36)
older <- birthday(ada)
cat(ada@age, older@age)פלט:
36 37slot(obj, "name") עושה את אותו הדבר כמו @ עם שם החריץ כמחרוזת, ולכן הוא פועל עם שם שמאוחסן במשתנה. slotNames() מציג את החריצים של מחלקה או אובייקט:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
for (s in slotNames(ada)) cat(s, "=", format(slot(ada, s)), "\n")
slot(ada, "age") <- 37
print(ada@age)פלט:
name = Ada
age = 36
[1] 37כל השמה נבדקת מול הטיפוס המוצהר, ולא רק new(). ערך שגוי נדחה והאובייקט שומר על הערך הישן שלו:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
ada@age <- "old"פלט:
Error in (function (cl, name, valueClass) :
assignment of an object of class “character” is not valid for @‘age’ in an object of class “Person”; is(value, "numeric") is not TRUE
Execution haltedgetSlots() מחזירה את כל שמות המשבצות יחד עם הטיפוס שהוגדר להן, וכך הקוד יכול להמיר קלט טקסט לטיפוס שהמשבצת מצפה לו:
setClass("Person", slots = c(name = "character", age = "numeric"))
types <- getSlots("Person")
print(types)
value <- "40"
if (types[["age"]] == "numeric") value <- as.numeric(value)
print(value + 1)פלט:
name age
"character" "numeric"
[1] 41אתגר
קללמחלקה Profile בקובץ Profile.R יש את המשבצות name ו-city (תווים) ו-age (מספרי). השלימו שתי פונקציות:
- הפונקציה
update_profile(p, field, value)עוצרת עםno field email(יש להשתמש ב-call. = FALSE) כאשר השדה אינו משבצת; אחרת היא ממירה את הטקסטvalueבאמצעותas.numeric()כאשר המשבצת היא מספרית, מגדירה את המשבצת באמצעותslot()ומחזירה את הפרופיל שהשתנה. - הפונקציה
profile_lines(p)מחזירה שורה אחת לכל משבצת, לפי סדר המשבצות:name: Ada.
הקוד שסופק קורא שם, ואז שורות כמו city=Paris או age=36, מחיל כל אחת מהן ומדפיס את שורות הפרופיל.
הקוד שלך צריך להופיע בקובץ Profile.R. הקובץ main.R מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.
נסו בעצמכם
source("Profile.R")
# קוד קלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
p <- new("Profile", name = input[1], city = "unknown", age = 0)
for (line in input[-1]) {
kv <- strsplit(line, "=")[[1]]
p <- tryCatch(update_profile(p, kv[1], kv[2]), error = function(e) {
cat("error: ", conditionMessage(e), "\n", sep = "")
p
})
}
for (l in profile_lines(p)) cat(l, "\n", sep = "")
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות S3
עבודה עם קבציםרשימות עם מחלקהפונקציות בנאימתודות print ו-formatמאמתים ופונקציות עזרחזרה – טמפרטורותתרגלו בעצמכם: קומפיילר R אונליין