Środowiska jako obiekty
Część sekcji Programowanie obiektowe ścieżki R w Coddy. Lekcja 18 z 57.
Środowisko to zbiór nazwanych wartości, podobny do listy, tworzony za pomocą new.env(). Różnica polega na tym, że środowisko nigdy nie jest kopiowane: każda zmienna, która się do niego odwołuje, widzi ten sam obiekt, więc zmiana wprowadzona za pomocą jednej nazwy jest widoczna za pomocą wszystkich:
e <- new.env()
e$count <- 1
alias <- e
alias$count <- 99
print(e$count)
l <- list(count = 1)
copy <- l
copy$count <- 99
print(l$count)Wynik:
[1] 99
[1] 1Funkcja, która otrzymuje środowisko, zmienia obiekt wywołującego. Nie musi niczego zwracać, a wywołujący nie przypisuje wyniku:
deposit <- function(acc, x) acc$balance <- acc$balance + x
acc <- new.env()
acc$balance <- 10
deposit(acc, 5)
deposit(acc, 5)
print(acc$balance)Wynik:
[1] 20assign(), get() i exists() działają z nazwą przechowywaną w zmiennej, a ls() wyświetla nazwy w środowisku w posortowanej kolejności:
e <- new.env()
for (fruit in c("pear", "apple")) assign(fruit, nchar(fruit), envir = e)
print(ls(e))
print(get("pear", envir = e))
print(exists("kiwi", envir = e))Wynik:
[1] "apple" "pear"
[1] 4
[1] FALSEŚrodowisko z atrybutem klasy jest obiektem S3 o semantyce referencyjnej: jego metody działają jak zwykle, a funkcje, które je zmieniają, robią to w miejscu:
new_wallet <- function(coins = 0) {
w <- new.env()
w$coins <- coins
class(w) <- "wallet"
w
}
print.wallet <- function(x, ...) {
cat("wallet with", x$coins, "coins\n")
invisible(x)
}
spend <- function(w, n) w$coins <- w$coins - n
w <- new_wallet(10)
spend(w, 3)
wWynik:
wallet with 7 coinsWyzwanie
ŁatwyInwentarz to środowisko klasy inventory z jedną zmienną, items, będącą nazwaną wektorową tablicą liczbową stanu zapasów. Uzupełnij plik Inventory.R:
new_inventory()tworzy środowisko z pustymitems(c()jest w porządku) oraz klasą.add_stock(inv, item, n)dodajendo stanu zapasów danego przedmiotu, zaczynając od 0 w przypadku nowego przedmiotu.take_stock(inv, item, n)odejmujeni zwracaTRUE, gdy zapasów jest wystarczająco dużo; w przeciwnym razie niczego nie zmienia i zwracaFALSE.stock_of(inv, item)zwraca stan zapasów; dla nieznanego przedmiotu zwraca 0.
Funkcje zmieniają inwentarz w miejscu i go nie zwracają. Dostarczony kod odczytuje polecenia add apple 5 i take apple 2, wyświetla wynik każdego polecenia take, a następnie każdy przedmiot w kolejności alfabetycznej.
Twój kod umieść w pliku Inventory.R. Plik main.R zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
source("Inventory.R")
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
input <- suppressWarnings(readLines(file("stdin")))
inv <- new_inventory()
for (line in input) {
p <- strsplit(line, " ")[[1]]
n <- as.numeric(p[3])
if (p[1] == "add") add_stock(inv, p[2], n)
if (p[1] == "take") cat("take ", p[2], ": ", if (take_stock(inv, p[2], n)) "ok" else "not enough", "\n", sep = "")
}
for (item in sort(names(inv$items))) cat(item, ": ", stock_of(inv, item), "\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