Aan de slagGa gratis aan de slag

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

Cursus bekijken

Oefeninstructies

Er is alvast een magnetronfabriek deels voor je gedefinieerd.

  • Voeg een publieke methode initialize() toe. Hiermee moet de gebruiker de velden power_rating_watts en door_is_open kunnen instellen wanneer het object wordt gemaakt.
    • De argumenten moeten power_rating_watts en door_is_open zijn.
    • In de body van de initialize()-methode geldt voor elk argument: als het niet missing() is (docs), stel dan het overeenkomstige private veld in.
  • Maak een magnetronobject met een vermogen van 650 watt en een open deur.
    • Roep de new()-methode van microwave_oven_factory aan.
    • Geef de argumenten power_rating_watts = 650 en door_is_open = TRUE door aan new().
    • Wijs het resultaat toe aan a_microwave_oven.

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 <- ___
Code bewerken en uitvoeren