تعريف فئات S4
جزء من قسم البرمجة كائنية التوجه في رحلة R على Coddy. الدرس 22 من 57.
S4 هو نظام الكائنات الرسمي في R. يعرّف setClass() صنفًا يحتوي على خانات مسمّاة ونوع كل منها، وينشئ new() كائنًا. يقرأ العامل @ خانةً:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
cat(ada@name, "is", ada@age)الناتج:
Ada is 36تُعيد setClass() أيضًا دالة منشئة. أسندها إلى اسم، وعادةً ما يكون اسم الصنف، واستدعها مثل المُنشئ:
Person <- setClass("Person", slots = c(name = "character", age = "numeric"))
bo <- Person(name = "Bo", age = 7)
print(bo@age + 1)
print(is(bo, "Person"))الناتج:
[1] 8
[1] TRUEعلى عكس S3، يتحقق R من الخانات. تؤدي الخانة غير المعروفة أو القيمة ذات النوع الخاطئ إلى إيقاف new() مع ظهور خطأ، لذا يكون لكائن S4 دائمًا الشكل الذي يحدده صنفه:
setClass("Person", slots = c(name = "character", age = "numeric"))
p <- new("Person", name = "Cy", age = "ten")المخرجات:
Error in validObject(.Object) :
invalid class “Person” object: invalid object for slot "age" in class "Person": got class "character", should be or extend class "numeric"
Calls: new -> initialize -> initialize -> validObject
Execution haltedتكون قيمة الخانة التي لم تُحدَّد فارغةً من نوعها، مثل character(0). أما prototype فيحدّد قيمًا افتراضية فعلية. يعرّف الكود الأقدم الخانات باستخدام representation()، وهذا يعني الشيء نفسه مثل slots:
setClass("Task", slots = c(title = "character", done = "logical"),
prototype = list(done = FALSE))
setClass("Note", representation(text = "character"))
t <- new("Task", title = "Write report")
print(t@done)
print(length(new("Note")@text))المخرجات:
[1] FALSE
[1] 0التحدي
سهلعرّف الفئة S4 Book في Book.R بثلاث خانات: title وauthor من النوع character وpages من النوع numeric. ثم أكمل book_label(b)، التي تقرأ الخانات باستخدام @ وتُرجع Dune by Frank Herbert (412 pages).
يقرأ الكود المرفق أسطرًا بالتنسيق title;author;pages، وينشئ كل كتاب باستخدام new("Book", ...)، ويطبع تسميته، ثم أسماء خانات الفئة.
ضع الكود في Book.R. يحتوي main.R على كود الإدخال/الإخراج المرفق، ولا يمكن تعديله.
جرّب بنفسك
source("Book.R")
# شيفرة الإدخال والإخراج المقدَّمة: أبقِها كما هي
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, ";")[[1]]
b <- new("Book", title = p[1], author = p[2], pages = as.numeric(p[3]))
cat(book_label(b), "\n", sep = "")
}
cat("slots: ", paste(slotNames("Book"), collapse = ", "), "\n", sep = "")
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات S3
التعامل مع الملفاتالقوائم باستخدام فئةدوال المُنشئأساليب الطباعة والتنسيقأدوات التحقق والمساعدةمراجعة - درجات الحرارة2S3 الدوال العامة والطرق
الدوال العامة وUseMethodالطرق الافتراضيةطرق الدوال العامة الأساسيةأساسيات NextMethodمراجعة - مساحات الأشكالتدرّب بنفسك: مترجم R عبر الإنترنت