Definiowanie klas S4
Część sekcji Programowanie obiektowe ścieżki R w Coddy. Lekcja 22 z 57.
S4 to formalny system obiektów języka R. setClass() deklaruje klasę z nazwanymi slotami i typem każdego z nich, a new() tworzy obiekt. Operator @ odczytuje slot:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
cat(ada@name, "is", ada@age)Wynik:
Ada is 36setClass() zwraca również funkcję generatora. Przypisz ją do nazwy, zwykle nazwy klasy, i wywołaj ją jak konstruktor:
Person <- setClass("Person", slots = c(name = "character", age = "numeric"))
bo <- Person(name = "Bo", age = 7)
print(bo@age + 1)
print(is(bo, "Person"))Wynik:
[1] 8
[1] TRUEW przeciwieństwie do S3, R sprawdza sloty. Nieznany slot lub wartość niewłaściwego typu powoduje, że new() kończy działanie błędem, więc obiekt S4 zawsze ma strukturę zadeklarowaną przez swoją klasę:
setClass("Person", slots = c(name = "character", age = "numeric"))
p <- new("Person", name = "Cy", age = "ten")Wynik:
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 haltedSlot, któremu nie przypisano wartości, otrzymuje pustą wartość swojego typu, na przykład character(0). prototype ustawia zamiast tego rzeczywiste wartości domyślne. Starszy kod deklaruje sloty za pomocą representation(), co oznacza to samo co 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))Wynik:
[1] FALSE
[1] 0Wyzwanie
ŁatwyZadeklaruj klasę S4 Book w pliku Book.R z trzema slotami: title i author typu character oraz pages typu numeric. Następnie uzupełnij book_label(b), która odczytuje sloty za pomocą @ i zwraca Dune by Frank Herbert (412 pages).
Dostarczony kod odczytuje wiersze title;author;pages, tworzy każdą książkę za pomocą new("Book", ...), wypisuje jej etykietę, a na końcu nazwy slotów klasy.
Twój kod umieść w pliku Book.R. main.R zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
source("Book.R")
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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 = "")
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy S3
Praca z plikamiListy z klasąFunkcje konstruktoraMetody print i formatWalidatory i funkcje pomocniczePowtórzenie — temperatury4Enkapsulacja w R
Domknięcia jako obiektyŚrodowiska jako obiektyFunkcje dostępoweOchrona stanuPodsumowanie – parkometr2Generics i metody S3
Generics i UseMethodMetody domyślneMetody dla podstawowych genericsPodstawy NextMethodPowtórzenie — pola figur5Klasy S4
Definiowanie klas S4Sloty i dostępSprawdzanie poprawnościMetody wyświetlaniaPodsumowanie – katalog produktów8Klasy referencyjne
Definiowanie klas referencyjnychMetody i aktualizacja pólSemantyka kopiowaniaDziedziczenie i callSuperPodsumowanie – kolejka zadań11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książek3Dziedziczenie S3
Wektory klasKolejność wyszukiwania metodRozszerzanie za pomocą NextMethodSprawdzanie za pomocą inherits()Powtórzenie — lista płac pracownikówPoćwicz samodzielnie: Kompilator R online