Menu
Coddy logo textTech

מתודות 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"
challenge icon

אתגר

קל

הפונקציה 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 = "")
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר R אונליין