Kom igångKom igång gratis

Det viktigaste först

Det finns en särskild publik metod som heter initialize() (notera den amerikanska engelska stavningen). Den anropas inte direkt av användaren. I stället anropas den automatiskt när ett objekt skapas – det vill säga när användaren anropar new().

initialize() låter dig ange värden för de privata fälten när du skapar ett R6-objekt. Mönstret för en initialize()-funktion ser ut så här:

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

Observera användningen av missing() (docs). Den returnerar TRUE om ett argument inte skickades med i funktionsanropet.

Argument till fabrikens new()-metod skickas vidare till initialize().

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

Den här övningen är en del av kursen

Objektorienterad programmering med S3 och R6 i R

Visa kurs

Övningsinstruktioner

En mikrovågsugnsfabrik har delvis definierats åt dig.

  • Lägg till en publik metod med namnet initialize(). Den ska låta användaren ange värden för fälten power_rating_watts och door_is_open när objektet skapas.
    • Argumenten ska vara power_rating_watts och door_is_open.
    • I kroppen av initialize()-metoden ska du, för varje argument, kontrollera om det inte är missing() (docs) – i så fall ska motsvarande privata fält tilldelas värdet.
  • Skapa ett mikrovågsugnsobjekt med en effekt på 650 watt och en öppen lucka.
    • Anropa microwave_oven_factorys new()-metod.
    • Skicka med argumenten power_rating_watts = 650 och door_is_open = TRUE till new().
    • Tilldela resultatet till a_microwave_oven.

Interaktiv övning med praktiskt arbete

Testa den här övningen genom att slutföra den här exempelkoden.

# 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 <- ___
Redigera och kör kod