Definiowanie klas referencyjnych
Część sekcji Programowanie obiektowe ścieżki R w Coddy. Lekcja 37 z 57.
Klasy referencyjne (RC) to system obiektów w R, które zmieniają się w miejscu, podobnie jak w Javie lub Pythonie. setRefClass() deklaruje klasę z typowanymi polami i zwraca generator; $new() tworzy obiekt, a $ odczytuje i zmienia jego pola:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
a <- Account$new(owner = "Ada", balance = 100)
a$balance <- a$balance + 50
cat(a$owner, a$balance)Wynik:
Ada 150Obiekt RC jest referencją, podobnie jak środowisko. Przypisanie go do innej zmiennej lub przekazanie do funkcji nie tworzy jego kopii, więc zmiana dokonana za pomocą dowolnej nazwy jest zmianą tego samego obiektu:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
pay_fee <- function(acc) acc$balance <- acc$balance - 5
a <- Account$new(owner = "Ada", balance = 100)
b <- a
b$balance <- 60
pay_fee(a)
cat(a$balance, b$balance)Wynik:
55 55Pola są typowane. Przypisanie wartości niewłaściwej klasy jest odrzucane, a pole zachowuje poprzednią wartość:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
a <- Account$new(owner = "Ada", balance = 100)
msg <- tryCatch({ a$balance <- "lots"; "changed" }, error = function(e) conditionMessage(e))
cat(msg, "\n")
cat(a$balance, "\n")Wynik:
invalid assignment for reference class field ‘balance’, should be from class “numeric” or a subclass (was class “character”)
100 Generator opisuje klasę: Account$fields() wyświetla pola i ich typy. Obiekt wypisany bez metody show wyświetla swoje pola; pole, któremu nie przypisano wartości, jest puste:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
print(Account$fields())
Account$new(owner = "Bo")Wynik:
owner balance
"character" "numeric"
Reference class object of class "Account"
Field "owner":
[1] "Bo"
Field "balance":
numeric(0)Wyzwanie
ŁatwyZadeklaruj klasę referencyjną Book w pliku Book.R z polami title i author (typu character) oraz pages (typu numeric), a generator pozostaw w Book. Następnie napisz add_pages(book, n), która bezpośrednio dodaje n do liczby stron książki i nie zwraca niczego użytecznego.
Dostarczony kod odczytuje title;author;pages, tworzy książkę, przypisuje ją do drugiej zmiennej, dodaje pozostałe liczby za pośrednictwem tej drugiej nazwy i wyświetla oryginalną książkę oraz nazwy pól.
Umieść swój kod w pliku Book.R. Plik 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")))
p <- strsplit(input[1], ";")[[1]]
b <- Book$new(title = p[1], author = p[2], pages = as.numeric(p[3]))
alias <- b
for (n in as.numeric(input[-1])) add_pages(alias, n)
cat(b$title, " by ", b$author, ": ", b$pages, " pages\n", sep = "")
cat("fields: ", paste(names(Book$fields()), 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