Elettricità statica
Le classi R6 possono sfruttare il comportamento di copia per riferimento degli environment per condividere campi tra oggetti. Per configurarlo, definisci un campo privato chiamato shared. Questo campo richiede diverse righe per essere definito. Dovrebbe:
- Creare un nuovo environment.
- Assegnare a quell’environment tutti i campi condivisi.
- Restituire l’environment.
I campi condivisi dovrebbero essere accessibili tramite active binding. Funzionano come gli altri active binding che hai già visto, ma recuperano i campi usando il prefisso private$shared$.
R6Class(
"Thing",
private = list(
shared = {
e <- new.env()
e$a_shared_field <- 123
e
}
),
active = list(
a_shared_field = function(value) {
if(missing(value)) {
private$shared$a_shared_field
} else {
private$shared$a_shared_field <- value
}
}
)
)
Nota che il nome dell’active binding deve essere lo stesso del campo condiviso che vuoi leggere o impostare; in entrambi i casi è a_shared_field nell’esempio sopra.
Questo esercizio fa parte del corso
Programmazione orientata agli oggetti con S3 e R6 in R
Istruzioni dell'esercizio
Una classe MicrowaveOven è stata parzialmente definita per te.
- Nell’elemento
privatedella classeMicrowaveOven, aggiorna il campo chiamatoshared.- Questo campo dovrebbe contenere tre righe di codice racchiuse tra parentesi graffe,
{}. - Per prima cosa deve chiamare
new.env()(docs) per creare un nuovo environment chiamatoe, poi … - Assegna a
euna variabile chiamatasafety_warning, con valore"Warning. Do not try to cook metal objects.", poi … - Restituisci l’environment.
- Questo campo dovrebbe contenere tre righe di codice racchiuse tra parentesi graffe,
- Aggiungi un active binding chiamato
safety_warningche legga o imposti il campo condiviso privatosafety_warning.- Definisci questo come una funzione all’interno dell’elemento
active. - Accetta un solo argomento chiamato
value. - Dovrebbe leggere o impostare
private$shared$safety_warning.
- Definisci questo come una funzione all’interno dell’elemento
- Crea due oggetti
MicrowaveOven, chiamati rispettivamentea_microwave_oveneanother_microwave_oven. - Modifica il campo
safety_warningsua_microwave_ovenin"Warning. If the food is too hot you may scald yourself.". - Controlla il campo
safety_warningsuanother_microwave_ovenper assicurarti che sia stato modificato.
esercizio interattivo pratico
Prova questo esercizio completando questo codice di esempio.
# Complete the class definition
microwave_oven_factory <- R6Class(
"MicrowaveOven",
private = list(
shared = {
# Create a new environment named e
___
# Assign safety_warning into e
___
# Return e
___
}
),
active = list(
# Add the safety_warning binding
safety_warning = ___(___) {
if(___(___)) {
___
} else {
___ <- ___
}
}
)
)
# Create two microwave ovens
a_microwave_oven <- ___
another_microwave_oven <- ___
# Change the safety warning for a_microwave_oven
___ <- "Warning. If the food is too hot you may scald yourself."
# Verify that the warning has change for another_microwave
___