طرق الدوال العامة الأساسية
جزء من قسم البرمجة كائنية التوجه في رحلة R على Coddy. الدرس 9 من 57.
العديد من الدوال في R الأساسي هي دوال عامة من نوع S3: print() وformat() وsummary() وtoString() وlength() وas.character() وغيرها. تؤدي إضافة طريقة إلى جعل فئتك تعمل مع دالة يعرفها كل مستخدم لـ R بالفعل. تُصدر summary.gradebook() تقريرًا عن كائن كامل:
summary.gradebook <- function(object, ...) {
paste0(length(object$marks), " marks, average ", mean(object$marks))
}
g <- structure(list(marks = c(70, 85, 91)), class = "gradebook")
cat(summary(g), "\n")الناتج:
3 marks, average 82 تحقّق من معاملات الدالة العامة قبل كتابة الطريقة: تستدعي summary() وسيطها الأول object، بينما تستدعي toString() وformat() هذا الوسيط x. يجب أن تُرجع toString() سلسلة نصية واحدة:
toString.gradebook <- function(x, ...) paste(x$marks, collapse = " / ")
g <- structure(list(marks = c(70, 85, 91)), class = "gradebook")
print(toString(g))المخرجات:
[1] "70 / 85 / 91"تغيّر طريقة length() معنى length() للفئة. ويمكن لقائمة انتظار تخزّن عناصرها في حقل أن تُبلغ عن عدد العناصر التي تحتوي عليها، بدلًا من عدد الحقول في القائمة:
q <- structure(list(items = c("a", "b", "c"), name = "jobs"), class = "queue")
print(length(q))
length.queue <- function(x) length(x$items)
print(length(q))الناتج:
[1] 2
[1] 3المعاملات عامة أيضًا. تعمل طريقة باسم "+.money"، وقد كُتبت بين علامتي اقتباس بسبب الرمز، عندما يكون أحد طرفي + كائنًا من نوع money. وتتلقى الطرفين باعتبارهما e1 وe2:
new_money <- function(amount) structure(list(amount = amount), class = "money")
"+.money" <- function(e1, e2) new_money(e1$amount + e2$amount)
"==.money" <- function(e1, e2) e1$amount == e2$amount
a <- new_money(5)
b <- new_money(7)
print((a + b)$amount)
print(a == b)الناتج:
[1] 12
[1] FALSEالتحدي
سهلتحتفظ المكدّسة بعناصرها في الحقل items، مع وجود قمة المكدّسة في النهاية. يتم توفير new_stack() وpush() وpop() في Stack.R. أضف ثلاث طرائق:
- تعيد
length.stack()عدد العناصر. - تعيد
toString.stack()العناصر من الأعلى إلى الأسفل، موصولةً بـ|، أوempty. - تعيد
summary.stack()القيمةstack of 3, top: c، أوstack of 0عندما تكون فارغة.
يقرأ الكود الموفَّر الأمرين push <item> وpop، ثم يطبع الطول وtoString() وsummary().
ضع الكود في Stack.R. يحتوي main.R على كود الإدخال/الإخراج الموفَّر، ولا يمكن تعديله.
جرّب بنفسك
source("Stack.R")
# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input <- suppressWarnings(readLines(file("stdin")))
s <- new_stack()
for (cmd in input) {
if (cmd == "pop") s <- pop(s) else s <- push(s, substring(cmd, 6))
}
cat("length: ", length(s), "\n", sep = "")
cat("items: ", toString(s), "\n", sep = "")
cat(summary(s), "\n", sep = "")
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات S3
التعامل مع الملفاتالقوائم باستخدام فئةدوال المُنشئأساليب الطباعة والتنسيقأدوات التحقق والمساعدةمراجعة - درجات الحرارة2S3 الدوال العامة والطرق
الدوال العامة وUseMethodالطرق الافتراضيةطرق الدوال العامة الأساسيةأساسيات NextMethodمراجعة - مساحات الأشكالتدرّب بنفسك: مترجم R عبر الإنترنت