Aan de slagGa gratis aan de slag

Statische elektriciteit

R6-klassen kunnen het kopiëren-op-referentiegedrag van omgevingen gebruiken om velden tussen objecten te delen. Om dit in te stellen, definieer je een privéveld met de naam shared. Dit veld kost enkele regels om te definiëren. Het moet:

  • Een nieuwe omgeving maken.
  • Eventuele gedeelde velden aan die omgeving toewijzen.
  • De omgeving retourneren.

De gedeelde velden moeten via actieve bindings worden benaderd. Deze werken op dezelfde manier als andere actieve bindings die je hebt gezien, maar halen de velden op met een private$shared$-prefix.

R6Class(
  "Thing",
  private = list(
    shared = {
      e <- new.env()
      e$a_shared_field <- 123
      e
    }
  ),
  active = list(
    a_shared_field = function(value) {
      if(missing(value)) {
        private$shared$a_shared_field
      } else {
        private$shared$a_shared_field <- value
      }
    }
  )
)

Let op dat de naam van de actieve binding hetzelfde moet zijn als de naam van het gedeelde veld dat je wilt ophalen of instellen; in het bovenstaande voorbeeld zijn ze allebei a_shared_field.

Deze oefening maakt deel uit van de cursus

Objectgeoriënteerd programmeren met S3 en R6 in R

Cursus bekijken

Oefeninstructies

Er is al deels een MicrowaveOven-klasse voor je gedefinieerd.

  • Werk in het private element van de MicrowaveOven-klasse het veld shared bij.
    • Dit veld moet drie regels code bevatten tussen accolades, {}.
    • Roep eerst new.env() (docs) aan om een nieuwe omgeving e te maken, en …
    • Wijs vervolgens in e een variabele toe met de naam safety_warning, met de waarde "Warning. Do not try to cook metal objects.", en …
    • Retourneer de omgeving.
  • Voeg een actieve binding safety_warning toe die het private gedeelde veld safety_warning ophaalt of instelt.
    • Definieer dit als een functie binnen het element active.
    • Deze neemt één argument met de naam value.
    • Deze moet private$shared$safety_warning ophalen of instellen.
  • Maak twee MicrowaveOven-objecten, met respectievelijk de namen a_microwave_oven en another_microwave_oven.
  • Verander het veld safety_warning op a_microwave_oven naar "Warning. If the food is too hot you may scald yourself.".
  • Bekijk het veld safety_warning op another_microwave_oven om te controleren dat dit is aangepast.

Praktische interactieve oefening

Probeer deze oefening eens door deze voorbeeldcode in te vullen.

# Complete the class definition
microwave_oven_factory <- R6Class(
  "MicrowaveOven",
  private = list(
    shared = {
      # Create a new environment named e
      ___
      # Assign safety_warning into e
      ___
      # Return e
      ___
    }
  ),
  active = list(
    # Add the safety_warning binding
    safety_warning = ___(___) {
      if(___(___)) {
        ___
      } else {
        ___ <- ___
      }
    }
  )
)

# Create two microwave ovens
a_microwave_oven <- ___
another_microwave_oven <- ___
  
# Change the safety warning for a_microwave_oven
___ <- "Warning. If the food is too hot you may scald yourself."
  
# Verify that the warning has change for another_microwave
___ 
Code bewerken en uitvoeren