EmpezarEmpieza gratis

First Thing's First

Hay un método público especial llamado initialize() (fíjate en la grafía en inglés estadounidense). El usuario no lo llama directamente. En su lugar, se ejecuta automáticamente cuando se crea un objeto; es decir, cuando el usuario llama a new().

initialize() te permite establecer los valores de los campos privados al crear un objeto R6. El patrón de una función initialize() es el siguiente:

thing_factory <- R6Class(
  "Thing",
  private = list(
    a_field = "a value",
    another_field = 123
  ),
  public = list(
    initialize = function(a_field, another_field) {
      if(!missing(a_field)) {
        private$a_field <- a_field
      }
      if(!missing(another_field)) {
        private$another_field <- another_field
      }
    }
  )
)

Fíjate en el uso de missing() (docs). Devuelve TRUE si no se pasó un argumento en la llamada a la función.

Los argumentos del método new() de la fábrica se pasan a initialize().

a_thing <- thing_factory$new(
  a_field = "a different value", 
  another_field = 456
)

Este ejercicio forma parte del curso

Programación orientada a objetos con S3 y R6 en R

Ver curso

Instrucciones del ejercicio

Se ha definido parcialmente una fábrica de microondas.

  • Añade un método público llamado initialize(). Esto debe permitir que el usuario establezca los campos power_rating_watts y door_is_open cuando se cree el objeto.
    • Los argumentos deben ser power_rating_watts y door_is_open.
    • En el cuerpo del método initialize(), para cada argumento, si no está missing() (docs), entonces se debe asignar el campo privado correspondiente.
  • Crea un objeto microondas con una potencia nominal de 650 vatios y la puerta abierta.
    • Llama al método new() de microwave_oven_factory.
    • Pasa los argumentos power_rating_watts = 650 y door_is_open = TRUE a new().
    • Asigna el resultado a a_microwave_oven.

ejercicio interactivo práctico

Prueba este ejercicio completando este código de ejemplo.

# Add an initialize method
microwave_oven_factory <- R6Class(
  "MicrowaveOven",
  private = list(
    power_rating_watts = 800,
    door_is_open = FALSE
  ),
  public = list(
    cook = function(time_seconds) {
      Sys.sleep(time_seconds)
      print("Your food is cooked!")
    },
    open_door = function() {
      private$door_is_open <- TRUE
    },
    close_door = function() {
      private$door_is_open <- FALSE
    },
    # Add initialize() method here
    ___ = ___(___, ___) {
      if(!missing(power_rating_watts)) {
        private$power_rating_watts <- power_rating_watts
      }
      ___
      
      
    }
  )
)

# Make a microwave
a_microwave_oven <- ___
Editar y ejecutar código