מתודות לגנריות הבסיס
חלק מהיחידה תכנות מונחה עצמים במסלול ה-R של Coddy. שיעור 9 מתוך 57.
פונקציות רבות ב־R הבסיסית הן גנריות של S3: print(), format(), summary(), toString(), length(), as.character() ועוד. הוספת מתודה מאפשרת למחלקה שלך לעבוד עם פונקציה שכל משתמש R כבר מכיר. summary.gradebook() מדווחת על אובייקט שלם:
summary.gradebook <- function(object, ...) {
paste0(length(object$marks), " marks, average ", mean(object$marks))
}
g <- structure(list(marks = c(70, 85, 91)), class = "gradebook")
cat(summary(g), "\n")פלט:
3 marks, average 82 בדוק את הפרמטרים של המחלקה הגנרית לפני כתיבת המתודה: summary() קוראת לארגומנט הראשון שלה object, ואילו toString() ו-format() קוראות לו x. toString() אמורה להחזיר מחרוזת אחת:
toString.gradebook <- function(x, ...) paste(x$marks, collapse = " / ")
g <- structure(list(marks = c(70, 85, 91)), class = "gradebook")
print(toString(g))פלט:
[1] "70 / 85 / 91"מתודה length() משנה את המשמעות של length() עבור המחלקה. תור ששומר את הפריטים שלו בשדה יכול לדווח כמה פריטים הוא מכיל, במקום את מספר השדות ברשימה:
q <- structure(list(items = c("a", "b", "c"), name = "jobs"), class = "queue")
print(length(q))
length.queue <- function(x) length(x$items)
print(length(q))פלט:
[1] 2
[1] 3גם אופרטורים הם גנריים. מתודה בשם "+.money", שנכתבת במירכאות בגלל הסימן, מופעלת כאשר אחד משני צדי + הוא אובייקט money. היא מקבלת את שני הצדדים בתור e1 ו־e2:
new_money <- function(amount) structure(list(amount = amount), class = "money")
"+.money" <- function(e1, e2) new_money(e1$amount + e2$amount)
"==.money" <- function(e1, e2) e1$amount == e2$amount
a <- new_money(5)
b <- new_money(7)
print((a + b)$amount)
print(a == b)פלט:
[1] 12
[1] FALSEאתגר
קלמחסנית שומרת את הפריטים שלה בשדה items, כאשר הפריט שבראש המחסנית הוא האחרון. הפונקציות new_stack(), push() ו־pop() בקובץ Stack.R נתונות. הוסיפו שלוש מתודות:
length.stack()מחזירה את מספר הפריטים.toString.stack()מחזירה את הפריטים מהראש לתחתית, כשהם מופרדים באמצעות|, אוempty.summary.stack()מחזירהstack of 3, top: c, אוstack of 0כשהיא ריקה.
הקוד שסופק קורא פקודות push <item> ו־pop, ואז מדפיס את האורך, את toString() ואת summary().
כתבו את הקוד שלכם בקובץ Stack.R. הקובץ main.R מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.
נסו בעצמכם
source("Stack.R")
# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
s <- new_stack()
for (cmd in input) {
if (cmd == "pop") s <- pop(s) else s <- push(s, substring(cmd, 6))
}
cat("length: ", length(s), "\n", sep = "")
cat("items: ", toString(s), "\n", sep = "")
cat(summary(s), "\n", sep = "")
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות S3
עבודה עם קבציםרשימות עם מחלקהפונקציות בנאימתודות print ו-formatמאמתים ופונקציות עזרחזרה – טמפרטורות2גנריות ומתודות של S3
גנריות ו־UseMethodמתודות ברירת מחדלמתודות לגנריות הבסיסיסודות NextMethodסיכום – שטחי צורותתרגלו בעצמכם: קומפיילר R אונליין