Electricidad estática
Las clases R6 pueden aprovechar el comportamiento de copia por referencia de los entornos para compartir campos entre objetos. Para configurarlo, define un campo privado llamado shared. Este campo se define en varias líneas. Debe:
- Crear un entorno nuevo.
- Asignar a ese entorno los campos compartidos.
- Devolver el entorno.
Los campos compartidos deben accederse mediante vinculaciones activas. Funcionan igual que otras vinculaciones activas que ya has visto, pero recuperan los campos usando el prefijo 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
}
}
)
)
Fíjate en que el nombre de la vinculación activa debe ser el mismo que el del campo compartido que quieres obtener o establecer; en el ejemplo anterior ambos son a_shared_field.
Este ejercicio forma parte del curso
Programación orientada a objetos con S3 y R6 en R
Instrucciones del ejercicio
Se te ha definido parcialmente una clase MicrowaveOven.
- En el elemento
privatede la claseMicrowaveOven, actualiza el campo llamadoshared.- Este campo debe contener tres líneas de código entre llaves,
{}. - Primero debe llamar a
new.env()(docs) para crear un nuevo entorno llamadoe, luego… - Asignar en
euna variable llamadasafety_warning, con el valor"Warning. Do not try to cook metal objects.", y después… - Devolver el entorno.
- Este campo debe contener tres líneas de código entre llaves,
- Añade una vinculación activa llamada
safety_warningque obtenga o establezca el campo compartido privadosafety_warning.- Defínela como una función dentro del elemento
active. - Recibe un único argumento llamado
value. - Debe obtener o establecer
private$shared$safety_warning.
- Defínela como una función dentro del elemento
- Crea dos objetos
MicrowaveOven, llamadosa_microwave_ovenyanother_microwave_ovenrespectivamente. - Cambia el campo
safety_warningdea_microwave_ovena"Warning. If the food is too hot you may scald yourself.". - Consulta el campo
safety_warningdeanother_microwave_ovenpara asegurarte de que se ha modificado.
ejercicio interactivo práctico
Prueba este ejercicio completando este código de ejemplo.
# 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
___