É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
Instructions
Une classe MicrowaveOven a été partiellement définie pour vous.
- Dans l’élément
privatede la classeMicrowaveOven, 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 à
eune variable nomméesafety_warning, ayant la valeur"Warning. Do not try to cook metal objects.", puis… - Renvoyez l’environnement.
- Ce champ doit contenir trois lignes de code entre accolades
- Ajoutez un active binding nommé
safety_warningqui 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.
- Définissez-le comme une fonction dans l’élément
- Créez deux objets
MicrowaveOven, nommés respectivementa_microwave_ovenetanother_microwave_oven. - Modifiez le champ
safety_warningdea_microwave_ovenavec"Warning. If the food is too hot you may scald yourself.". - Consultez le champ
safety_warningdeanother_microwave_ovenpour 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
___