S4 Sınıflarını Tanımlama
Coddy'nin R Journey'sinin Nesne Tabanlı Programlama bölümünün bir parçası. Ders 22 / 57.
S4, R'nin biçimsel nesne sistemidir. setClass(), adlandırılmış slotlar ve her birinin türüyle bir sınıf bildirir; new() ise bir nesne oluşturur. @ işleci bir slotu okur:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
cat(ada@name, "is", ada@age)Çıktı:
Ada is 36setClass() ayrıca bir üretici işlev döndürür. Ona bir ad, genellikle sınıf adını verin ve onu bir kurucu gibi çağırın:
Person <- setClass("Person", slots = c(name = "character", age = "numeric"))
bo <- Person(name = "Bo", age = 7)
print(bo@age + 1)
print(is(bo, "Person"))Çıktı:
[1] 8
[1] TRUES3'ün aksine, R slot'ları denetler. Bilinmeyen bir slot veya yanlış türdeki bir değer, new() işlevini bir hatayla durdurur; bu nedenle bir S4 nesnesi her zaman sınıfının bildirdiği yapıya sahiptir:
setClass("Person", slots = c(name = "character", age = "numeric"))
p <- new("Person", name = "Cy", age = "ten")Çıktı:
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 haltedBir değer verilmeyen slot, character(0) gibi kendi türünün boş değerini alır. prototype ise bunun yerine gerçek varsayılan değerleri belirler. Eski kod, slot'ları representation() ile bildirir; bu, slots ile aynı anlama gelir:
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))Çıktı:
[1] FALSE
[1] 0Görev
KolayBook S4 sınıfını Book.R dosyasında üç slot ile tanımlayın: title ve author türü character, pages ise türü numeric olsun. Ardından slotları @ ile okuyan ve Dune by Frank Herbert (412 pages) değerini döndüren book_label(b) işlevini tamamlayın.
Sağlanan kod, title;author;pages satırlarını okur, her kitabı new("Book", ...) ile oluşturur, etiketini yazdırır ve son olarak sınıfın slot adlarını yazdırır.
Kodunuz Book.R dosyasına gider. main.R dosyası, sağlanan giriş/çıkış kodunu içerir ve düzenlenemez.
Kendin dene
source("Book.R")
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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 = "")
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Tabanlı Programlama bölümündeki tüm dersler
1S3 Temelleri
Dosyalarla ÇalışmaSınıf ile ListelerYapıcı FonksiyonlarPrint ve Format MetotlarıDoğrulayıcılar ve YardımcılarTekrar - Sıcaklıklar4R'da Kapsülleme
Nesne Olarak Closure'larNesne Olarak OrtamlarErişimci FonksiyonlarDurumu KorumaÖzet - Parkmetre2S3 Generic'leri ve Metotları
Generic'ler ve UseMethodVarsayılan MetotlarTemel Generic'ler için MetotlarNextMethod TemelleriTekrar - Şekil Alanları5S4 Sınıfları
S4 Sınıflarını TanımlamaSlotlar ve ErişimGeçerlilik KontrolleriShow MetotlarıÖzet - Ürün Kataloğu8Referans Sınıfları
Referans Sınıflarını TanımlamaMetotlar ve Alan GüncellemeleriKopyalama SemantiğiKalıtım ve callSuperÖzet - Görev Kuyruğu11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç AlmaKendi başına pratik yap: Online R derleyicisi