Najpierw najważniejsze
Istnieje jedna specjalna metoda publiczna o nazwie initialize() (zwróć uwagę na pisownię). Nie jest ona wywoływana bezpośrednio przez użytkownika – jest wywoływana automatycznie podczas tworzenia obiektu, czyli gdy użytkownik wywołuje new().
initialize() pozwala ustawić wartości prywatnych pól podczas tworzenia obiektu R6. Wzorzec funkcji initialize() wygląda następująco:
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
}
}
)
)
Zwróć uwagę na użycie funkcji missing() (dokumentacja). Zwraca ona TRUE, jeśli argument nie został przekazany w wywołaniu funkcji.
Argumenty metody new() fabryki są przekazywane do initialize().
a_thing <- thing_factory$new(
a_field = "a different value",
another_field = 456
)
To ćwiczenie jest częścią kursu
Programowanie obiektowe z S3 i R6 w R
Instrukcje do ćwiczenia
Fabryka kuchenki mikrofalowej została dla ciebie częściowo zdefiniowana.
- Dodaj metodę publiczną o nazwie
initialize(). Powinna ona umożliwiać użytkownikowi ustawienie pólpower_rating_wattsidoor_is_openpodczas tworzenia obiektu.- Argumentami metody powinny być
power_rating_wattsidoor_is_open. - W ciele metody
initialize(), dla każdego argumentu: jeśli nie jest onmissing()(dokumentacja), ustaw odpowiednie prywatne pole.
- Argumentami metody powinny być
- Utwórz obiekt kuchenki mikrofalowej o mocy
650watów i otwartych drzwiczkach.- Wywołaj metodę
new()fabrykimicrowave_oven_factory. - Przekaż argumenty
power_rating_watts = 650idoor_is_open = TRUEdonew(). - Przypisz wynik do zmiennej
a_microwave_oven.
- Wywołaj metodę
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
# 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 <- ___