Zacznij terazZacznij za darmo

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

Zobacz kurs

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ól power_rating_watts i door_is_open podczas tworzenia obiektu.
    • Argumentami metody powinny być power_rating_watts i door_is_open.
    • W ciele metody initialize(), dla każdego argumentu: jeśli nie jest on missing() (dokumentacja), ustaw odpowiednie prywatne pole.
  • Utwórz obiekt kuchenki mikrofalowej o mocy 650 watów i otwartych drzwiczkach.
    • Wywołaj metodę new() fabryki microwave_oven_factory.
    • Przekaż argumenty power_rating_watts = 650 i door_is_open = TRUE do new().
    • Przypisz wynik do zmiennej a_microwave_oven.

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 <- ___
Edytuj i uruchom kod