Listy z klasą
Część sekcji Programowanie obiektowe ścieżki R w Coddy. Lekcja 2 z 57.
S3 to najstarszy i najczęściej używany system obiektów w R. Obiekt S3 to zwykła lista z atrybutem class, etykietą określającą, jakiego rodzaju jest to obiekt. class(x) <- "dog" ustawia etykietę:
rex <- list(name = "Rex", age = 3)
class(rex) <- "dog"
print(class(rex))
cat(rex$name, "is", rex$age)Wynik:
[1] "dog"
Rex is 3structure() tworzy wartość i ustawia jej atrybuty w jednym wywołaniu, co jest typowym sposobem tworzenia obiektu S3. Pola odczytuje się za pomocą $, tak jak w każdej liście:
rex <- structure(list(name = "Rex", age = 3), class = "dog")
print(class(rex))
print(is.list(rex))
print(rex$age)Wynik:
[1] "dog"
[1] TRUE
[1] 3Klasa to tylko etykieta: R nie sprawdza, jakie pola ma obiekt, więc każdą listę można nazwać dog. unclass() usuwa etykietę i zwraca zwykłą listę:
p <- structure(list(x = 1, y = 2), class = "point")
print(unclass(p))Wynik:
$x
[1] 1
$y
[1] 2Obiekty S3 są wartościami. Funkcja, która zmienia obiekt, zmienia jego własną kopię, więc zwraca nową wersję, a wywołujący ją kod przypisuje ją do zmiennej. Oryginał pozostaje bez zmian:
birthday <- function(d) {
d$age <- d$age + 1
d
}
rex <- structure(list(name = "Rex", age = 3), class = "dog")
older <- birthday(rex)
cat(rex$age, older$age)Wynik:
3 4Wyzwanie
ŁatwyUzupełnij make_pet(name, species, age) w pliku Pet.R. Funkcja zwraca listę z polami name, species i age, w tej kolejności, oraz klasę pet. Następnie uzupełnij describe_pet(p), która zwraca jedno zdanie: zwierzę o imieniu Rex, gatunku dog i wieku 3 daje Rex is a 3 year old dog.
Dostarczony kod odczytuje imię, gatunek i wiek, tworzy zwierzę, a następnie wypisuje jego klasę, nazwy pól i zdanie.
Twój kod umieść w pliku Pet.R. Plik main.R zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
source("Pet.R")
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
input <- suppressWarnings(readLines(file("stdin")))
p <- make_pet(input[1], input[2], as.numeric(input[3]))
cat("class: ", class(p), "\n", sep = "")
cat("fields: ", paste(names(p), collapse = ", "), "\n", sep = "")
cat(describe_pet(p), "\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