Nejdřív to nejdůležitější
Existuje jedna speciální veřejná metoda s názvem initialize() (pozor na anglické pravopis). Uživatel ji nevolá přímo — spustí se automaticky při vytvoření objektu, tedy když zavoláš new().
initialize() ti umožňuje nastavit hodnoty privátních polí hned při vytváření R6 objektu. Vzor funkce initialize() vypadá takto:
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
}
}
)
)
Všimni si použití funkce missing() (dokumentace). Ta vrátí TRUE, pokud argument nebyl při volání funkce předán.
Argumenty předané metodě new() továrny se přeposílají do initialize().
a_thing <- thing_factory$new(
a_field = "a different value",
another_field = 456
)
Toto cvičení je součástí kurzu
Objektově orientované programování s S3 a R6 v R
Pokyny k cvičení
Továrna na mikrovlnné trouby je pro tebe částečně připravená.
- Přidej veřejnou metodu s názvem
initialize(). Ta uživateli umožní nastavit polepower_rating_wattsadoor_is_openpři vytváření objektu.- Argumenty metody by měly být
power_rating_wattsadoor_is_open. - V těle metody
initialize()zkontroluj pro každý argument, zda nenímissing()(dokumentace), a pokud ne, nastav odpovídající privátní pole.
- Argumenty metody by měly být
- Vytvoř objekt mikrovlnné trouby s výkonem
650wattů a otevřenými dvířky.- Zavolej metodu
new()továrnymicrowave_oven_factory. - Předej metodě
new()argumentypower_rating_watts = 650adoor_is_open = TRUE. - Výsledek přiřaď do proměnné
a_microwave_oven.
- Zavolej metodu
Interaktivní cvičení na vyzkoušení si v praxi
Vyzkoušejte si toto cvičení dokončením tohoto ukázkového kódu.
# 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 <- ___