EmpezarEmpieza gratis

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

Ver curso

Instrucciones del ejercicio

Se te ha definido parcialmente una clase MicrowaveOven.

  • En el elemento private de la clase MicrowaveOven, actualiza el campo llamado shared.
    • Este campo debe contener tres líneas de código entre llaves, {}.
    • Primero debe llamar a new.env() (docs) para crear un nuevo entorno llamado e, luego…
    • Asignar en e una variable llamada safety_warning, con el valor "Warning. Do not try to cook metal objects.", y después…
    • Devolver el entorno.
  • Añade una vinculación activa llamada safety_warning que obtenga o establezca el campo compartido privado safety_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.
  • Crea dos objetos MicrowaveOven, llamados a_microwave_oven y another_microwave_oven respectivamente.
  • Cambia el campo safety_warning de a_microwave_oven a "Warning. If the food is too hot you may scald yourself.".
  • Consulta el campo safety_warning de another_microwave_oven para 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
___ 
Editar y ejecutar código