פונקציות גישה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-R של Coddy. שיעור 19 מתוך 57.
כימוס פירושו שקוד אחר עובד עם אובייקט באמצעות פונקציות במקום לגשת ישירות לשדות שלו. getter קורא ערך, ו-setter משנה אותו. עבור רשימת S3, ה-setter מחזיר את העותק שהשתנה:
new_member <- function(name) structure(list(name = name), class = "member")
get_name <- function(p) p$name
set_name <- function(p, value) {
p$name <- value
p
}
p <- new_member("ada")
p <- set_name(p, "Ada Lovelace")
print(get_name(p))פלט:
[1] "Ada Lovelace"מאפשרי גישה מאפשרים לאובייקט לשנות את אופן אחסון הנתונים שלו בלי לשבור את הקוד שמשתמש בו. המדחום הזה מאחסן מעלות צלזיוס, ו-getter מחשב את המעלות בפרנהייט כשמבקשים זאת, כך שהקוד שקורא לו לעולם לא נחשף לשדה עצמו:
new_thermo <- function(c) structure(list(c = c), class = "thermo")
celsius <- function(t) t$c
fahrenheit <- function(t) t$c * 9 / 5 + 32
t <- new_thermo(25)
cat(celsius(t), fahrenheit(t))פלט:
25 77גם setters מובנים של R, כמו names(x) <- ..., הם פונקציות החלפה. פונקציה בשם "name<-" עם הפרמטרים x ו-value מאפשרת למי שקוראים לה לכתוב name(p) <- "Bo"; R קוראת לה ומשייכת את התוצאה בחזרה ל-p:
new_member <- function(name) structure(list(name = name), class = "member")
name <- function(p) p$name
"name<-" <- function(x, value) {
x$name <- trimws(value)
x
}
p <- new_member("ada")
name(p) <- " Bo "
print(name(p))פלט:
[1] "Bo"פונקציית getter של אובייקט סגירה מחזירה עותק של הנתונים הפרטיים. שינוי העותק הזה אינו משנה את האובייקט, ולכן הדרך היחידה לגשת אליו היא דרך הפונקציות של האובייקט עצמו:
make_list <- function() {
items <- character(0)
list(add = function(x) items <<- c(items, x),
get_items = function() items)
}
todo <- make_list()
todo$add("milk")
mine <- todo$get_items()
mine[1] <- "HACKED"
print(todo$get_items())פלט:
[1] "milk"אתגר
קלאיש קשר הוא רשימת S3 מהמחלקה contact עם השדות name ו-email. השלימו את Contact.R:
new_contact(name, email)שומרת את כתובת האימייל לאחר הסרת הרווחים מסביבה ובאותיות קטנות.- פונקציות האחזור
contact_name(x)ו-contact_email(x). - פונקציית ההחלפה
"contact_email<-", ששומרת את כתובת האימייל החדשה לאחר הסרת הרווחים מסביבה ובאותיות קטנות, כך שהקוד שקורא לה יוכל לכתובcontact_email(c1) <- value.
הקוד שסופק קורא name,email, ולאחר מכן כתובות אימייל חדשות, ומדפיס Ada <ada@x.com> אחרי כל שינוי ואת שמות השדות המאוחסנים בסוף.
כתבו את הקוד שלכם ב-Contact.R. הקובץ main.R מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.
נסו בעצמכם
source("Contact.R")
# קוד קלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
p <- strsplit(input[1], ",")[[1]]
c1 <- new_contact(p[1], p[2])
cat(contact_name(c1), " <", contact_email(c1), ">\n", sep = "")
for (value in input[-1]) {
contact_email(c1) <- value
cat(contact_name(c1), " <", contact_email(c1), ">\n", sep = "")
}
cat("stored fields: ", paste(names(unclass(c1)), collapse = ", "), "\n", sep = "")
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות S3
עבודה עם קבציםרשימות עם מחלקהפונקציות בנאימתודות print ו-formatמאמתים ופונקציות עזרחזרה – טמפרטורותתרגלו בעצמכם: קומפיילר R אונליין