Det viktigaste först
Det finns en särskild publik metod som heter initialize() (notera den amerikanska engelska stavningen). Den anropas inte direkt av användaren. I stället anropas den automatiskt när ett objekt skapas – det vill säga när användaren anropar new().
initialize() låter dig ange värden för de privata fälten när du skapar ett R6-objekt. Mönstret för en initialize()-funktion ser ut så här:
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
}
}
)
)
Observera användningen av missing() (docs). Den returnerar TRUE om ett argument inte skickades med i funktionsanropet.
Argument till fabrikens new()-metod skickas vidare till initialize().
a_thing <- thing_factory$new(
a_field = "a different value",
another_field = 456
)
Den här övningen är en del av kursen
Objektorienterad programmering med S3 och R6 i R
Övningsinstruktioner
En mikrovågsugnsfabrik har delvis definierats åt dig.
- Lägg till en publik metod med namnet
initialize(). Den ska låta användaren ange värden för fältenpower_rating_wattsochdoor_is_opennär objektet skapas.- Argumenten ska vara
power_rating_wattsochdoor_is_open. - I kroppen av
initialize()-metoden ska du, för varje argument, kontrollera om det inte ärmissing()(docs) – i så fall ska motsvarande privata fält tilldelas värdet.
- Argumenten ska vara
- Skapa ett mikrovågsugnsobjekt med en effekt på
650watt och en öppen lucka.- Anropa
microwave_oven_factorysnew()-metod. - Skicka med argumenten
power_rating_watts = 650ochdoor_is_open = TRUEtillnew(). - Tilldela resultatet till
a_microwave_oven.
- Anropa
Interaktiv övning med praktiskt arbete
Testa den här övningen genom att slutföra den här exempelkoden.
# 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 <- ___