Sloty i dostęp
Część sekcji Programowanie obiektowe ścieżki R w Coddy. Lekcja 23 z 57.
obj@slot <- value zmienia slot. Podobnie jak obiekty S3, obiekty S4 są wartościami: funkcja, która zmienia jeden z nich, działa na jego własnej kopii i ją zwraca:
setClass("Person", slots = c(name = "character", age = "numeric"))
birthday <- function(p) {
p@age <- p@age + 1
p
}
ada <- new("Person", name = "Ada", age = 36)
older <- birthday(ada)
cat(ada@age, older@age)Wynik:
36 37slot(obj, "name") robi to samo co @ z nazwą slotu w postaci ciągu znaków, więc działa z nazwą przechowywaną w zmiennej. slotNames() wyświetla sloty klasy lub obiektu:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
for (s in slotNames(ada)) cat(s, "=", format(slot(ada, s)), "\n")
slot(ada, "age") <- 37
print(ada@age)Wynik:
name = Ada
age = 36
[1] 37Każde przypisanie jest sprawdzane pod kątem zadeklarowanego typu, nie tylko new(). Nieprawidłowa wartość zostaje odrzucona, a obiekt zachowuje poprzednią:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
ada@age <- "old"Wynik:
Error in (function (cl, name, valueClass) :
assignment of an object of class “character” is not valid for @‘age’ in an object of class “Person”; is(value, "numeric") is not TRUE
Execution haltedgetSlots() zwraca każdą nazwę slotu wraz z zadeklarowanym typem, co pozwala kodowi konwertować tekstowe dane wejściowe na typ oczekiwany przez slot:
setClass("Person", slots = c(name = "character", age = "numeric"))
types <- getSlots("Person")
print(types)
value <- "40"
if (types[["age"]] == "numeric") value <- as.numeric(value)
print(value + 1)Wynik:
name age
"character" "numeric"
[1] 41Wyzwanie
ŁatwyKlasa Profile w pliku Profile.R ma sloty name i city (typu znakowego) oraz age (typu numerycznego). Uzupełnij dwie funkcje:
update_profile(p, field, value)kończy działanie komunikatemno field email(użyjcall. = FALSE), gdy pole nie jest slotem; w przeciwnym razie konwertuje tekstową wartośćvalueza pomocąas.numeric(), jeśli slot jest numeryczny, ustawia slot za pomocąslot()i zwraca zmodyfikowany profil.profile_lines(p)zwraca po jednym wierszu na każdy slot, w kolejności slotów:name: Ada.
Dostarczony kod odczytuje imię, a następnie wiersze takie jak city=Paris lub age=36, stosuje każdą z wartości i wypisuje wiersze profilu.
Twój kod umieść w pliku Profile.R. Plik main.R zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
source("Profile.R")
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
input <- suppressWarnings(readLines(file("stdin")))
p <- new("Profile", name = input[1], city = "unknown", age = 0)
for (line in input[-1]) {
kv <- strsplit(line, "=")[[1]]
p <- tryCatch(update_profile(p, kv[1], kv[2]), error = function(e) {
cat("error: ", conditionMessage(e), "\n", sep = "")
p
})
}
for (l in profile_lines(p)) cat(l, "\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