מתודות עבור רכיבים מובנים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-R של Coddy. שיעור 28 מתוך 57.
גם setMethod() מוסיפה מתודות S4 לפונקציות בסיסיות כמו length() ו-summary(). פונקציית הבסיס ממשיכה לפעול עבור כל השאר, והמחלקה שלך מקבלת התנהגות משלה:
setClass("Playlist", slots = c(name = "character", songs = "character"))
setMethod("length", "Playlist", function(x) length(x@songs))
pl <- new("Playlist", name = "gym", songs = c("a", "b", "c"))
print(length(pl))
print(length(c(1, 2)))פלט:
[1] 3
[1] 2גם אופרטורים הם גנריים. מתודה עבור + מציינת את המחלקות של שני הצדדים בתוך signature(). שני הארגומנטים נקראים e1 ו-e2:
setClass("Money", slots = c(amount = "numeric"))
setMethod("show", "Money", function(object) cat(sprintf("%.2f", object@amount), "\n"))
setMethod("+", signature("Money", "Money"), function(e1, e2) {
new("Money", amount = e1@amount + e2@amount)
})
new("Money", amount = 2.5) + new("Money", amount = 4)פלט:
6.50 הגנרית הקבוצתית Arith מייצגת את +, -, *, /, ^ ואת כל השאר בבת אחת. בתוך המתודה שלה, callGeneric() חוזרת על האופרטור שבו השתמשת, עבור הערכים שמעבירים לה:
setClass("Money", slots = c(amount = "numeric"))
setMethod("Arith", signature("Money", "numeric"), function(e1, e2) {
new("Money", amount = callGeneric(e1@amount, e2))
})
m <- new("Money", amount = 10)
cat((m * 3)@amount, (m / 4)@amount, (m - 1)@amount)פלט:
30 2.5 9הגנריקה הקבוצתית Compare מכסה את ==, <, > ואת היתר. המתודה שלה מחזירה את מה ש-callGeneric() מחזירה עבור ה-slots, ערך לוגי:
setClass("Money", slots = c(amount = "numeric"))
setMethod("Compare", signature("Money", "Money"), function(e1, e2) {
callGeneric(e1@amount, e2@amount)
})
a <- new("Money", amount = 5)
b <- new("Money", amount = 8)
cat(a < b, a == b, a >= b)פלט:
TRUE FALSE FALSEאתגר
קללמחלקה Money ב־Money.R יש את השדות amount (מספרי) ו־currency (תווים). הוסיפו ארבע שיטות:
show()מדפיסה12.50 EURושורה חדשה;+עבור שני אובייקטים מסוגMoneyמחזירה את הסכום שלהם, או עוצרת עםcannot add EUR and USD(השתמשו ב־call. = FALSE) כאשר המטבעות שונים;*עבורMoneyומספר מחזירה את הסכום לאחר הכפלה;==עבור שני אובייקטים מסוגMoneyמחזירהTRUEכאשר גם הסכום וגם המטבע שווים.
הקוד שסופק קורא שורות 10:EUR + 2.5:EUR, 4:USD * 3 או 1:EUR == 1:EUR ומדפיס את התוצאה או את error: ואת הודעת השגיאה.
הקוד שלכם נמצא ב־Money.R. הקובץ main.R מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.
נסו בעצמכם
source("Money.R")
# קוד קלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
parse_money <- function(t) {
p <- strsplit(t, ":")[[1]]
new("Money", amount = as.numeric(p[1]), currency = p[2])
}
for (line in input) {
p <- strsplit(line, " ")[[1]]
a <- parse_money(p[1])
tryCatch({
if (p[2] == "+") print(a + parse_money(p[3]))
if (p[2] == "*") print(a * as.numeric(p[3]))
if (p[2] == "==") cat(a == parse_money(p[3]), "\n", sep = "")
}, error = function(e) cat("error: ", conditionMessage(e), "\n", sep = ""))
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות S3
עבודה עם קבציםרשימות עם מחלקהפונקציות בנאימתודות print ו-formatמאמתים ופונקציות עזרחזרה – טמפרטורות3ירושה ב-S3
וקטורי מחלקהסדר חיפוש המתודותהרחבה באמצעות NextMethodבדיקה באמצעות inherits()סיכום – שכר העובדים6S4: גנריות ומתודות
יצירת גנריותמתודות עבור רכיבים מובניםבחירת מתודה לפי שני ארגומנטיםsetValidity ו-validObjectסיכום – כסף ומטבעתרגלו בעצמכם: קומפיילר R אונליין