First things first
Er is één speciale publieke methode met de naam initialize() (let op de Amerikaanse spelling). Deze wordt niet rechtstreeks door de gebruiker aangeroepen. In plaats daarvan wordt ze automatisch aangeroepen wanneer een object wordt gemaakt; dus wanneer de gebruiker new() aanroept.
Met initialize() kun je bij het aanmaken van een R6-object de waarden van de private velden instellen. Het patroon voor een initialize()-functie is als volgt:
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
}
}
)
)
Let op het gebruik van missing() (docs). Dit geeft TRUE terug als een argument niet is doorgegeven in de functieaanroep.
Argumenten voor de new()-methode van de factory worden doorgegeven aan initialize().
a_thing <- thing_factory$new(
a_field = "a different value",
another_field = 456
)
Deze oefening maakt deel uit van de cursus
Objectgeoriënteerd programmeren met S3 en R6 in R
Oefeninstructies
Er is alvast een magnetronfabriek deels voor je gedefinieerd.
- Voeg een publieke methode
initialize()toe. Hiermee moet de gebruiker de veldenpower_rating_wattsendoor_is_openkunnen instellen wanneer het object wordt gemaakt.- De argumenten moeten
power_rating_wattsendoor_is_openzijn. - In de body van de
initialize()-methode geldt voor elk argument: als het nietmissing()is (docs), stel dan het overeenkomstige private veld in.
- De argumenten moeten
- Maak een magnetronobject met een vermogen van
650watt en een open deur.- Roep de
new()-methode vanmicrowave_oven_factoryaan. - Geef de argumenten
power_rating_watts = 650endoor_is_open = TRUEdoor aannew(). - Wijs het resultaat toe aan
a_microwave_oven.
- Roep de
Praktische interactieve oefening
Probeer deze oefening eens door deze voorbeeldcode in te vullen.
# 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 <- ___