מתודות show
חלק מהיחידה תכנות מונחה עצמים במסלול ה-R של Coddy. שיעור 25 מתוך 57.
כאשר מדפיסים אובייקט S4, R קוראת לפונקציה show(). ללא מתודה למחלקה, היא מציגה את כל המשבצות, וזה נכון אך ארוך:
setClass("Point", slots = c(x = "numeric", y = "numeric"))
p <- new("Point", x = 1, y = 2)
pפלט:
An object of class "Point"
Slot "x":
[1] 1
Slot "y":
[1] 2setMethod("show", "Point", function(object) ...) מעניק למחלקה הדפסה משלה. המתודה מדפיסה באמצעות cat(), ומשתמשים בה גם כשאובייקט מודפס ברמה העליונה וגם על ידי print():
setClass("Point", slots = c(x = "numeric", y = "numeric"))
setMethod("show", "Point", function(object) {
cat("Point(", object@x, ", ", object@y, ")\n", sep = "")
})
p <- new("Point", x = 1, y = 2)
p
print(p)פלט:
Point(1, 2)
Point(1, 2)משבצת יכולה להכיל אובייקט S4 נוסף: יש להצהיר על הסוג שלה באמצעות שם המחלקה. המתודה החיצונית show() יכולה להדפיס את האובייקט הפנימי באמצעות קריאה ל-show() עליו:
setClass("Point", slots = c(x = "numeric", y = "numeric"))
setMethod("show", "Point", function(object) cat("(", object@x, ", ", object@y, ")", sep = ""))
setClass("Line", slots = c(from = "Point", to = "Point"))
setMethod("show", "Line", function(object) {
cat("line ")
show(object@from)
cat(" -> ")
show(object@to)
cat("\n")
})
new("Line", from = new("Point", x = 0, y = 0), to = new("Point", x = 3, y = 4))פלט:
line (0, 0) -> (3, 4)מחלקה וירטואלית, המוצהרת באמצעות representation("VIRTUAL"), אי אפשר ליצור בעזרת new(). היא קיימת כדי להיות מחלקת־אב משותפת למחלקות אחרות, שעליה מתבסס פרק הירושה של S4. isVirtualClass() מבחינה בין שני הסוגים:
setClass("Shape", representation("VIRTUAL"))
setClass("Point", slots = c(x = "numeric"))
cat(isVirtualClass("Shape"), isVirtualClass("Point"), "\n")
msg <- tryCatch(new("Shape"), error = function(e) "cannot create a Shape")
cat(msg, "\n")פלט:
TRUE FALSE
cannot create a Shape אתגר
קלנקודות וקטעים הם שתי מחלקות S4 בשני קבצים. המחלקות מוגדרות. הוסיפו להן את המתודות show():
- ב-
Point.R: נקודה מודפסת בתורPoint(1, 2)ואחריה שורה חדשה. - ב-
Segment.R: קטע מודפס בתורSegment Point(1, 2) to Point(4, 6), length 5ואחריו שורה חדשה, כשהאורך מעוגל לשתי ספרות עשרוניות. בנו בעצמכם את הטקסט של הנקודה או השתמשו בפונקציית עזר; המתודה של הנקודה מדפיסה שורה חדשה משלה, לכן אל תקראו לה באמצע השורה של הקטע.
הקוד שסופק קורא שורות 1,2 4,6, מדפיס את הנקודה הראשונה ולאחר מכן את הקטע, שניהם באמצעות המתודות show() שלהם.
הקוד שלכם ייכנס ל-Point.R ול-Segment.R. הקובץ main.R מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.
נסו בעצמכם
source("Point.R")
source("Segment.R")
# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
n <- as.numeric(strsplit(line, "[ ,]")[[1]])
a <- new("Point", x = n[1], y = n[2])
b <- new("Point", x = n[3], y = n[4])
print(a)
print(new("Segment", from = a, to = b))
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות S3
עבודה עם קבציםרשימות עם מחלקהפונקציות בנאימתודות print ו-formatמאמתים ופונקציות עזרחזרה – טמפרטורותתרגלו בעצמכם: קומפיילר R אונליין