الطرق للدوال المضمّنة
جزء من قسم البرمجة كائنية التوجه في رحلة 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() للفتحات، أي قيمة منطقية:
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
التعامل مع الملفاتالقوائم باستخدام فئةدوال المُنشئأساليب الطباعة والتنسيقأدوات التحقق والمساعدةمراجعة - درجات الحرارة2S3 الدوال العامة والطرق
الدوال العامة وUseMethodالطرق الافتراضيةطرق الدوال العامة الأساسيةأساسيات NextMethodمراجعة - مساحات الأشكال3وراثة S3
متجهات الأصنافترتيب البحث عن الأساليبالتوسعة باستخدام NextMethodالتحقق باستخدام inherits()مراجعة - رواتب الموظفين6S4 الدوال العامة والطرق
إنشاء الدوال العامةالطرق للدوال المضمّنةاختيار الطريقة بناءً على وسيطينsetValidity و validObjectمراجعة - المال والعملةتدرّب بنفسك: مترجم R عبر الإنترنت