CommencerCommencer gratuitement

Électricité statique

Les classes R6 peuvent utiliser 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 s’écrit sur plusieurs lignes. Il doit :

  • Créer un nouvel environnement.
  • Y affecter tous les champs partagés.
  • Renvoyer l’environnement.

Les champs partagés doivent être accessibles via des active bindings. Ils fonctionnent comme les autres active bindings que vous avez 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’active binding doit être identique au nom du champ partagé que vous souhaitez lire ou modifier ; ils sont tous deux a_shared_field dans l’exemple ci-dessus.

Cet exercice fait partie du cours

Programmation orientée objet avec S3 et R6 en R

Afficher le cours

Instructions

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 entre accolades {}.
    • D’abord, appelez new.env() (docs) pour créer un nouvel environnement nommé e, puis…
    • Affectez à e une variable nommée safety_warning, ayant la valeur "Warning. Do not try to cook metal objects.", puis…
    • Renvoyez l’environnement.
  • Ajoutez un active binding nommé safety_warning qui lit ou écrit le champ partagé privé safety_warning.
    • Définissez-le comme une fonction dans l’élément active.
    • Elle prend un seul argument nommé value.
    • Elle doit lire ou écrire 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 avec "Warning. If the food is too hot you may scald yourself.".
  • Consultez le champ safety_warning de another_microwave_oven pour vérifier qu’il a bien été modifié.

Exercice interactif pratique

Essayez cet exercice en complétant cet exemple de code.

# 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