Menu
Coddy logo textTech

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 36

setClass() 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] TRUE

S3'ü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 halted

Bir 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] 0
challenge icon

Görev

Kolay

Book 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 = "")
quiz iconKendini test et

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

Kendi başına pratik yap: Online R derleyicisi