LoslegenKostenlos loslegen

First Thing's First

Es gibt eine spezielle öffentliche Methode namens initialize() (achte auf die amerikanische Schreibweise). Diese wird nicht direkt von der Nutzerin/dem Nutzer aufgerufen. Stattdessen wird sie automatisch aufgerufen, wenn ein Objekt erstellt wird, also wenn new() aufgerufen wird.

Mit initialize() kannst du beim Erstellen eines R6-Objekts die Werte der privaten Felder setzen. Das Muster für eine initialize()-Funktion sieht so aus:

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
      }
    }
  )
)

Beachte die Verwendung von missing() (Docs). Das ergibt TRUE, wenn ein Argument beim Funktionsaufruf nicht übergeben wurde.

Argumente der new()-Methode der Factory werden an initialize() weitergereicht.

a_thing <- thing_factory$new(
  a_field = "a different value", 
  another_field = 456
)

Diese Übung ist Teil des Kurses

Objektorientierte Programmierung mit S3 und R6 in R

Kurs anzeigen

Anleitung zur Übung

Eine Mikrowellen-Factory ist teilweise für dich definiert.

  • Füge eine öffentliche Methode namens initialize() hinzu. Diese soll es der Nutzerin/dem Nutzer erlauben, beim Erstellen des Objekts die Felder power_rating_watts und door_is_open zu setzen.
    • Die Argumente sollten power_rating_watts und door_is_open sein.
    • Im Rumpf der initialize()-Methode gilt: Für jedes Argument, wenn es nicht missing() ist (Docs), dann soll das entsprechende private Feld gesetzt werden.
  • Erstelle ein Mikrowellenobjekt mit einer Leistung von 650 Watt und geöffneter Tür.
    • Rufe die new()-Methode von microwave_oven_factory auf.
    • Übergebe die Argumente power_rating_watts = 650 und door_is_open = TRUE an new().
    • Weisen den Rückgabewert a_microwave_oven zu.

Interaktive Übung

Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.

# 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 bearbeiten und ausführen