מתודות print ו-format
חלק מהיחידה תכנות מונחה עצמים במסלול ה-R של Coddy. שיעור 4 מתוך 57.
כאשר ערך מודפס, R קוראת לפונקציה print(). בלי משהו מיוחד למחלקה, אובייקט S3 מודפס כרשימה שלו ולאחריה מאפיין המחלקה, דבר שקשה לקרוא:
m <- structure(list(amount = 9.5, currency = "EUR"), class = "money")
print(m)פלט:
$amount
[1] 9.5
$currency
[1] "EUR"
attr(,"class")
[1] "money"מתודה היא פונקציה ששמה הוא generic.class. כאשר print() מקבלת אובייקט מהמחלקה money, היא מחפשת את print.money() וקוראת לה במקום זאת. מתודת הדפסה כותבת באמצעות cat() ומסתיימת ב-invisible(x), כך שהיא מחזירה את האובייקט בלי להדפיס אותו פעם נוספת:
print.money <- function(x, ...) {
cat("<money ", x$amount, " ", x$currency, ">\n", sep = "")
invisible(x)
}
m <- structure(list(amount = 9.5, currency = "EUR"), class = "money")
print(m)
mפלט:
<money 9.5 EUR>
<money 9.5 EUR>format() היא הגנרית להמרת ערך לטקסט. מתודה format.money() מחזירה את הטקסט במקום להדפיס אותו, כך שקוד אחר יכול לשלב אותו במשפט, ומתודת ההדפסה יכולה להשתמש בו שוב:
format.money <- function(x, ...) {
sprintf("%.2f %s", x$amount, x$currency)
}
print.money <- function(x, ...) {
cat("Money:", format(x), "\n")
invisible(x)
}
m <- structure(list(amount = 9.5, currency = "EUR"), class = "money")
m
cat("You owe", format(m), "\n")פלט:
Money: 9.50 EUR
You owe 9.50 EUR מתודה מקבלת את אותם ארגומנטים כמו הגנרית שלה. print() ו־format() מוגדרות כ־function(x, ...), לכן גם המתודות שלהן מתחילות ב־x, .... ... מקבל ארגומנטים נוספים, כגון digits, שהקורא עשוי להעביר. מתודות פועלות בכל מקום שבו קוראים לגנרית, למשל בתוך vapply():
format.money <- function(x, ...) sprintf("%.2f %s", x$amount, x$currency)
wallet <- list(
structure(list(amount = 3, currency = "EUR"), class = "money"),
structure(list(amount = 0.5, currency = "USD"), class = "money")
)
print(vapply(wallet, format, character(1)))פלט:
[1] "3.00 EUR" "0.50 USD"אתגר
קלהפונקציה new_money() שבקובץ Money.R נתונה. הוסף שני מתודות לאותו קובץ:
format.money(x, ...)מחזירה את הסכום עם שתי ספרות אחרי הנקודה העשרונית ואת המטבע:9.50 EUR.print.money(x, ...)מדפיסה<money 9.50 EUR>בשורה משלה, באמצעותformat(), ומחזירהinvisible(x).
הקוד שסופק קורא שורות 9.5 EUR, מדפיס כל אובייקט money, ואז מדפיס list: עם כל הסכומים בפורמט, כשהם מחוברים באמצעות + .
הקוד שלך יופיע ב-Money.R. הקובץ main.R מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.
נסו בעצמכם
source("Money.R")
# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
all <- list()
for (line in input) {
p <- strsplit(line, " ")[[1]]
m <- new_money(as.numeric(p[1]), p[2])
print(m)
all[[length(all) + 1]] <- m
}
cat("list: ", paste(vapply(all, format, character(1)), collapse = " + "), "\n", sep = "")
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות S3
עבודה עם קבציםרשימות עם מחלקהפונקציות בנאימתודות print ו-formatמאמתים ופונקציות עזרחזרה – טמפרטורותתרגלו בעצמכם: קומפיילר R אונליין