Ambienti come oggetti
Fa parte della sezione Programmazione orientata agli oggetti del percorso R di Coddy. Lezione 18 di 57.
Un ambiente è un insieme di valori con nome, come una lista, creato con new.env(). La differenza è che un ambiente non viene mai copiato: ogni variabile che vi fa riferimento vede lo stesso oggetto, quindi una modifica tramite un nome è visibile tramite tutti gli altri:
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)Risultato:
[1] 99
[1] 1Una funzione che riceve un ambiente modifica l’oggetto del chiamante. Non deve restituire nulla e il chiamante non assegna un risultato:
deposit <- function(acc, x) acc$balance <- acc$balance + x
acc <- new.env()
acc$balance <- 10
deposit(acc, 5)
deposit(acc, 5)
print(acc$balance)Output:
[1] 20assign(), get() ed exists() lavorano con un nome contenuto in una variabile, e ls() elenca i nomi in un ambiente in ordine alfabetico:
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))Output:
[1] "apple" "pear"
[1] 4
[1] FALSEUn ambiente con un attributo class è un oggetto S3 con semantica di riferimento: i suoi metodi funzionano come al solito e le funzioni che lo modificano agiscono direttamente su di esso:
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)
wOutput:
wallet with 7 coinsSfida
FacileUn inventario è un ambiente della classe inventory con una variabile, items, un vettore numerico con nome delle scorte. Completa Inventory.R:
new_inventory()crea l'ambiente con unitemsvuoto (c()va bene) e la classe.add_stock(inv, item, n)aggiungenalle scorte dell'articolo, partendo da 0 per un nuovo articolo.take_stock(inv, item, n)rimuovene restituisceTRUEquando la quantità è sufficiente; altrimenti non modifica nulla e restituisceFALSE.stock_of(inv, item)restituisce le scorte, 0 per un articolo sconosciuto.
Le funzioni modificano l'inventario sul posto e non lo restituiscono. Il codice fornito legge i comandi add apple 5 e take apple 2, stampa il risultato di ogni take, poi ogni articolo in ordine alfabetico.
Il tuo codice va in Inventory.R. main.R contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
source("Inventory.R")
# Codice di input/output fornito: lascialo così com'è
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 = "")
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Nozioni di base su S3
Lavorare con i fileListe con una classeFunzioni costruttriciMetodi di stampa e formattazioneValidatori e funzioni di supportoRipasso - Temperature4Incapsulamento in R
Chiusure come oggettiAmbienti come oggettiFunzioni di accessoProteggere lo statoRiepilogo - Parcometro2Generics e metodi S3
Generics e UseMethodMetodi predefinitiMetodi per i generics di baseNozioni di base su NextMethodRiepilogo - Aree delle forme5Classi S4
Definire le classi S4Slot e accessoControlli di validitàMetodi showRiepilogo - Catalogo prodotti8Classi di riferimento
Definizione delle classi di riferimentoMetodi e aggiornamenti dei campiSemantica della copiaEreditarietà e callSuperRiepilogo - coda di attività11Progetto: Gestione della biblioteca
Libri e iscrittiPrestito dei libriEsercitati da solo: Compilatore R online