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
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 campospower_rating_wattsydoor_is_opencuando se cree el objeto.- Los argumentos deben ser
power_rating_wattsydoor_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.
- Los argumentos deben ser
- Crea un objeto microondas con una potencia nominal de
650vatios y la puerta abierta.- Llama al método
new()demicrowave_oven_factory. - Pasa los argumentos
power_rating_watts = 650ydoor_is_open = TRUEanew(). - Asigna el resultado a
a_microwave_oven.
- Llama al método
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 <- ___