Menu
Coddy logo textTech

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, tak 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 150

Obiekt 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 55

Pola mają określony typ. Próba przypisania wartości niewłaściwej klasy zostaje odrzucona, 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 wydrukowany 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)
challenge icon

Wyzwanie

Łatwy

Zadeklaruj Reference Class Book w pliku Book.R z polami title i author (character) oraz pages (numeric), a generator pozostaw w Book. Następnie napisz add_pages(book, n), która dodaje n do liczby stron książki bezpośrednio i nie zwraca niczego przydatnego.

Dostarczony kod odczytuje title;author;pages, tworzy książkę, przypisuje ją do drugiej zmiennej, dodaje pozostałe liczby za pomocą tej drugiej nazwy i wypisuje oryginalną książkę oraz nazwy pól.

Twój kod umieść 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 = "")
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator R online