Prima di tutto
Esiste un metodo pubblico speciale chiamato initialize() (nota l’ortografia in inglese americano). Questo non viene chiamato direttamente dall’utente. Viene invece richiamato automaticamente quando si crea un oggetto; cioè quando l’utente chiama new().
initialize() ti permette di impostare i valori dei campi privati quando crei un oggetto R6. Lo schema per una funzione initialize() è il seguente:
thing_factory <- R6Class(
"Thing",
private = list(
a_field = "a value",
another_field = 123
),
public = list(
initialize = function(a_field, another_field) {
if(!missing(a_field)) {
private$a_field <- a_field
}
if(!missing(another_field)) {
private$another_field <- another_field
}
}
)
)
Nota l’uso di missing() (docs). Questa funzione restituisce TRUE se un argomento non è stato passato nella chiamata alla funzione.
Gli argomenti del metodo new() della factory vengono passati a initialize().
a_thing <- thing_factory$new(
a_field = "a different value",
another_field = 456
)
Questo esercizio fa parte del corso
Programmazione orientata agli oggetti con S3 e R6 in R
Istruzioni dell'esercizio
Una factory di forni a microonde è stata parzialmente definita per te.
- Aggiungi un metodo pubblico chiamato
initialize(). Questo deve permettere all’utente di impostare i campipower_rating_wattsedoor_is_openquando l’oggetto viene creato.- Gli argomenti devono essere
power_rating_wattsedoor_is_open. - Nel corpo del metodo
initialize(), per ciascun argomento, se non èmissing()(docs), allora imposta il corrispondente campo privato.
- Gli argomenti devono essere
- Crea un oggetto microonde con una potenza nominale di
650watt e con la porta aperta.- Chiama il metodo
new()dimicrowave_oven_factory. - Passa gli argomenti
power_rating_watts = 650edoor_is_open = TRUEanew(). - Assegna il risultato a
a_microwave_oven.
- Chiama il metodo
esercizio interattivo pratico
Prova questo esercizio completando questo codice di esempio.
# Add an initialize method
microwave_oven_factory <- R6Class(
"MicrowaveOven",
private = list(
power_rating_watts = 800,
door_is_open = FALSE
),
public = list(
cook = function(time_seconds) {
Sys.sleep(time_seconds)
print("Your food is cooked!")
},
open_door = function() {
private$door_is_open <- TRUE
},
close_door = function() {
private$door_is_open <- FALSE
},
# Add initialize() method here
___ = ___(___, ___) {
if(!missing(power_rating_watts)) {
private$power_rating_watts <- power_rating_watts
}
___
}
)
)
# Make a microwave
a_microwave_oven <- ___