أساليب الطباعة والتنسيق
جزء من قسم البرمجة كائنية التوجه في رحلة 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، ويطبع كل كائن نقود، ثم يطبع 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
التعامل مع الملفاتالقوائم باستخدام فئةدوال المُنشئأساليب الطباعة والتنسيقأدوات التحقق والمساعدةمراجعة - درجات الحرارة2S3 الدوال العامة والطرق
الدوال العامة وUseMethodالطرق الافتراضيةطرق الدوال العامة الأساسيةأساسيات NextMethodمراجعة - مساحات الأشكالتدرّب بنفسك: مترجم R عبر الإنترنت