Inizia subitoInizia gratis

Elettricità statica

Le classi R6 possono sfruttare il comportamento di copia per riferimento degli environment per condividere campi tra oggetti. Per configurarlo, definisci un campo privato chiamato shared. Questo campo richiede diverse righe per essere definito. Dovrebbe:

  • Creare un nuovo environment.
  • Assegnare a quell’environment tutti i campi condivisi.
  • Restituire l’environment.

I campi condivisi dovrebbero essere accessibili tramite active binding. Funzionano come gli altri active binding che hai già visto, ma recuperano i campi usando il prefisso private$shared$.

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

Nota che il nome dell’active binding deve essere lo stesso del campo condiviso che vuoi leggere o impostare; in entrambi i casi è a_shared_field nell’esempio sopra.

Questo esercizio fa parte del corso

Programmazione orientata agli oggetti con S3 e R6 in R

Visualizza corso

Istruzioni dell'esercizio

Una classe MicrowaveOven è stata parzialmente definita per te.

  • Nell’elemento private della classe MicrowaveOven, aggiorna il campo chiamato shared.
    • Questo campo dovrebbe contenere tre righe di codice racchiuse tra parentesi graffe, {}.
    • Per prima cosa deve chiamare new.env() (docs) per creare un nuovo environment chiamato e, poi …
    • Assegna a e una variabile chiamata safety_warning, con valore "Warning. Do not try to cook metal objects.", poi …
    • Restituisci l’environment.
  • Aggiungi un active binding chiamato safety_warning che legga o imposti il campo condiviso privato safety_warning.
    • Definisci questo come una funzione all’interno dell’elemento active.
    • Accetta un solo argomento chiamato value.
    • Dovrebbe leggere o impostare private$shared$safety_warning.
  • Crea due oggetti MicrowaveOven, chiamati rispettivamente a_microwave_oven e another_microwave_oven.
  • Modifica il campo safety_warning su a_microwave_oven in "Warning. If the food is too hot you may scald yourself.".
  • Controlla il campo safety_warning su another_microwave_oven per assicurarti che sia stato modificato.

esercizio interattivo pratico

Prova questo esercizio completando questo codice di esempio.

# 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
___ 
Modifica ed esegui il codice