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 resmi nesne sistemidir. setClass(), adlandırılmış slot'lar ve her birinin türüyle bir sınıf tanımlar; new() ise bir nesne oluşturur. @ operatörü bir slot'u 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 üreteç işlevi döndürür. Bu işlevi, genellikle sınıf adı olan bir ada atayın ve 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'ten farklı olarak, R slotları denetler. Bilinmeyen bir slot veya yanlış türde bir değer, new() işlevinin hatayla durmasına neden olur; böylece bir S4 nesnesi her zaman sınıfının tanımladığı şekle sahip olur:
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 haltedAtanmayan bir slota, character(0) gibi türünün boş değeri verilir. prototype ise gerçek varsayılan değerleri belirler. Eski kodlar slotları representation() ile tanımlar; 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.R dosyasında üç yuvaya sahip S4 sınıfı Book'u tanımlayın: title ve author türü character, pages ise türü numeric olsun. Ardından, yuvaları @ ile okuyan ve Dune by Frank Herbert (412 pages) döndüren book_label(b) işlevini tamamlayın.
Verilen kod title;author;pages satırlarını okur, her kitap için new("Book", ...) kullanarak bir kitap oluşturur, etiketini yazdırır ve son olarak sınıfın yuva adlarını yazdırır.
Kodunuzu Book.R dosyasına yazın. main.R, verilen girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
source("Book.R")
# Sağlanan giriş/çıkış 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