מתודות ברירת מחדל
חלק מהיחידה תכנות מונחה עצמים במסלול ה-R של Coddy. שיעור 8 מתוך 57.
כשאין שיטה שמתאימה למחלקה, UseMethod() מחפשת את שיטת ברירת המחדל, name.default. היא משמשת כחלופה עבור כל מחלקה שהגנרית אינה מכירה:
describe <- function(x) UseMethod("describe")
describe.dog <- function(x) paste("a dog called", x$name)
describe.default <- function(x) "something I do not know"
rex <- structure(list(name = "Rex"), class = "dog")
car <- structure(list(), class = "car")
print(describe(rex))
print(describe(car))פלט:
[1] "a dog called Rex"
[1] "something I do not know"ללא שיטת ברירת מחדל, קריאה לגנרית עם מחלקה לא מוכרת מסתיימת בשגיאה:
describe <- function(x) UseMethod("describe")
describe.dog <- function(x) paste("a dog called", x$name)
car <- structure(list(), class = "car")
describe(car)פלט:
Error in UseMethod("describe") :
no applicable method for 'describe' applied to an object of class "car"
Calls: describe
Execution haltedגם ערכים פשוטים נשלחים לשיטות. למספר ללא מאפיין מחלקה יש מחלקה משתמעת numeric, לטקסט יש character, ול־TRUE יש logical, לכן שיטות עבור שמות אלה פועלות על וקטורים רגילים:
describe <- function(x) UseMethod("describe")
describe.numeric <- function(x) paste("numbers adding up to", sum(x))
describe.character <- function(x) paste("words:", paste(x, collapse = " "))
describe.default <- function(x) "something else"
print(describe(c(1, 2, 3)))
print(describe(c("a", "b")))
print(describe(TRUE))פלט:
[1] "numbers adding up to 6"
[1] "words: a b"
[1] "something else"גם שיטת ברירת מחדל יכולה לסרב בנימוס: stop() עם הודעה המציינת את המחלקה, כדי שהקורא יידע מה השתבש. class(x)[1] היא המחלקה הראשונה של האובייקט:
area <- function(shape) UseMethod("area")
area.square <- function(shape) shape$side^2
area.default <- function(shape) {
stop("cannot compute the area of a ", class(shape)[1], call. = FALSE)
}
for (s in list(structure(list(side = 2), class = "square"), structure(list(), class = "blob"))) {
cat(tryCatch(area(s), error = function(e) conditionMessage(e)), "\n")
}פלט:
4
cannot compute the area of a blob אתגר
קלהשלימו את הגנרית describe(x) שבקובץ Describe.R ואת המתודות שלה עבור וקטורים פשוטים:
describe.numeric()מחזירה3 numbers, sum 6.describe.character()מחזירה2 words, longest: apple(את הראשונה מבין המילים הארוכות ביותר במקרה של תיקו).describe.logical()מחזירה2 of 3 are TRUE.describe.default()מחזירהsomething else.
הקוד שסופק קורא שורות num 1,2,3, chr apple,kiwi, lgl TRUE,FALSE,TRUE או כל מילה אחרת עם ערכים, שאותם הוא הופך לרשימה. הוא מדפיס describe() עבור כל אחת מהן.
הקוד שלך ייכנס לקובץ Describe.R. הקובץ main.R מכיל את קוד הקלט/פלט שסופק, ואי אפשר לערוך אותו.
נסו בעצמכם
source("Describe.R")
# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, " ")[[1]]
values <- strsplit(p[2], ",")[[1]]
x <- switch(p[1],
num = as.numeric(values),
chr = values,
lgl = as.logical(values),
list(values))
cat(describe(x), "\n", sep = "")
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות S3
עבודה עם קבציםרשימות עם מחלקהפונקציות בנאימתודות print ו-formatמאמתים ופונקציות עזרחזרה – טמפרטורות2גנריות ומתודות של S3
גנריות ו־UseMethodמתודות ברירת מחדלמתודות לגנריות הבסיסיסודות NextMethodסיכום – שטחי צורותתרגלו בעצמכם: קומפיילר R אונליין