Začněte nyníZačněte zdarma

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

Zobrazit kurz

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 pole power_rating_watts a door_is_open při vytváření objektu.
    • Argumenty metody by měly být power_rating_watts a door_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.
  • Vytvoř objekt mikrovlnné trouby s výkonem 650 wattů a otevřenými dvířky.
    • Zavolej metodu new() továrny microwave_oven_factory.
    • Předej metodě new() argumenty power_rating_watts = 650 a door_is_open = TRUE.
    • Výsledek přiřaď do proměnné a_microwave_oven.

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 <- ___
Upravit a spustit kód