Metodi e aggiornamenti dei campi
Fa parte della sezione Programmazione orientata agli oggetti del percorso R di Coddy. Lezione 38 di 57.
I metodi vanno nella lista methods di setRefClass(). All'interno di un metodo, i campi sono nomi semplici e <<- modifica un campo. Nel runner di Coddy, R stampa una nota sul pacchetto opzionale codetools quando viene definita una classe con metodi, quindi racchiudi la definizione in suppressMessages():
Counter <- suppressMessages(setRefClass("Counter",
fields = list(count = "numeric"),
methods = list(
add = function(n = 1) {
count <<- count + n
},
report = function() paste("count is", count)
)
))
c1 <- Counter$new(count = 0)
c1$add()
c1$add(5)
print(c1$report())Output:
[1] "count is 6".self è l'oggetto su cui è stato chiamato il metodo. Un metodo che termina con invisible(.self) restituisce l'oggetto, così è possibile concatenare le chiamate:
Counter <- suppressMessages(setRefClass("Counter",
fields = list(count = "numeric"),
methods = list(
add = function(n = 1) {
count <<- count + n
invisible(.self)
}
)
))
c1 <- Counter$new(count = 0)
c1$add(2)$add(3)$add(4)
print(c1$count)Output:
[1] 9Il metodo initialize viene eseguito all’interno di $new(). initFields(...) imposta i campi che sono stati passati; successivamente il metodo può assegnare valori predefiniti agli altri. I metodi si richiamano a vicenda per nome:
Account <- suppressMessages(setRefClass("Account",
fields = list(owner = "character", balance = "numeric"),
methods = list(
initialize = function(...) {
initFields(...)
if (length(balance) == 0) balance <<- 0
invisible(.self)
},
deposit = function(x) balance <<- balance + x,
deposit_twice = function(x) {
deposit(x)
deposit(x)
}
)
))
a <- Account$new(owner = "Ada")
a$deposit_twice(10)
print(a$balance)Output:
[1] 20All'interno di un metodo, un semplice <- assegnato al nome di un campo crea una variabile locale con quel nome e lascia invariato il campo. Usa <<- per ogni modifica di un campo:
Counter <- suppressMessages(setRefClass("Counter",
fields = list(count = "numeric"),
methods = list(
broken = function() count <- count + 1,
working = function() count <<- count + 1
)
))
c1 <- Counter$new(count = 0)
c1$broken()
c1$broken()
c1$working()
print(c1$count)Output:
[1] 1Sfida
FacileCompleta la classe Reference Class Stack in Stack.R. Conserva gli elementi nel campo items (character, ultimo in cima) e ha quattro metodi:
push(x)aggiungexin cima e restituisceinvisible(.self), così è possibile concatenare le chiamate a push;pop()rimuove e restituisce l’elemento in cima, oppure restituiscenothingquando lo stack è vuoto;peek()restituisce l’elemento in cima senza rimuoverlo, oppurenothing;size()restituisce il numero di elementi.
La definizione è già racchiusa in suppressMessages(). Il codice fornito legge i comandi push a b, pop e peek, poi aggiunge altri due elementi con un’unica chiamata concatenata e stampa la dimensione.
Il tuo codice va in Stack.R. main.R contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
source("Stack.R")
# Codice di input/output fornito: lascialo così com'è
input <- suppressWarnings(readLines(file("stdin")))
s <- Stack$new()
for (cmd in input) {
if (startsWith(cmd, "push ")) {
items <- strsplit(substring(cmd, 6), " ")[[1]]
for (it in items) s$push(it)
} else if (cmd == "pop") {
cat("popped ", s$pop(), "\n", sep = "")
} else if (cmd == "peek") {
cat("top ", s$peek(), "\n", sep = "")
}
}
s$push("x")$push("y")
cat("size after two chained pushes: ", s$size(), "\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