CommencezCommencez gratuitement

Électricité statique

Les classes R6 peuvent exploiter le comportement de copie par référence des environnements pour partager des champs entre objets. Pour mettre cela en place, définissez un champ privé nommé shared. Ce champ nécessite plusieurs lignes ; il doit :

  • Créer un nouvel environnement.
  • Y attribuer tous les champs partagés.
  • Retourner l'environnement.

Les champs partagés doivent être accessibles au moyen d'agents actifs (active bindings). Ils fonctionnent comme ceux que vous avez déjà vus, mais récupèrent les champs en utilisant le préfixe 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
      }
    }
  )
)

Notez que le nom de l'agent actif doit être identique au nom du champ partagé que vous souhaitez lire ou modifier ; dans l'exemple ci-dessus, ils s'appellent tous deux a_shared_field.

Cette activité fait partie du cours

Programmation orientée objet avec S3 et R6 en R

Voir le cours

Instructions de l’exercice

Une classe MicrowaveOven a été partiellement définie pour vous.

  • Dans l'élément private de la classe MicrowaveOven, mettez à jour le champ nommé shared.
    • Ce champ doit contenir trois lignes de code délimitées par des accolades {}.
    • D'abord, appelez new.env() (docs) pour créer un nouvel environnement nommé e, puis…
    • Attribuez à e une variable nommée safety_warning, qui prend la valeur "Warning. Do not try to cook metal objects.", puis…
    • Retournez l'environnement.
  • Ajoutez un agent actif nommé safety_warning qui lit ou modifie le champ privé partagé safety_warning.
    • Définissez-le comme une fonction dans l'élément active.
    • Elle prend un seul argument nommé value.
    • Elle doit lire ou modifier private$shared$safety_warning.
  • Créez deux objets MicrowaveOven, nommés respectivement a_microwave_oven et another_microwave_oven.
  • Modifiez le champ safety_warning de a_microwave_oven à "Warning. If the food is too hot you may scald yourself.".
  • Consultez le champ safety_warning de another_microwave_oven pour confirmer qu'il a été modifié.

Exercice interactif pratique

Essayez cet exercice en complétant ce code d’exemple.

# 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
___ 
Modifier et exécuter le code