Primeiro o mais importante
Existe um método público especial chamado initialize() (observe a grafia em inglês americano). Ele não é chamado diretamente pelo usuário. Em vez disso, é chamado automaticamente quando um objeto é criado; ou seja, quando o usuário chama new().
initialize() permite definir os valores dos campos privados ao criar um objeto R6. O padrão para uma função initialize() é o seguinte:
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
}
}
)
)
Note o uso de missing() (docs). Essa função retorna TRUE se um argumento não foi passado na chamada da função.
Os argumentos para o método new() da fábrica são passados para initialize().
a_thing <- thing_factory$new(
a_field = "a different value",
another_field = 456
)
Este exercicio faz parte do curso
Programação Orientada a Objetos com S3 e R6 em R
Instruções do exercicio
Uma fábrica de micro-ondas foi parcialmente definida para você.
- Adicione um método público chamado
initialize(). Ele deve permitir que o usuário defina os campospower_rating_wattsedoor_is_openquando o objeto for criado.- Os argumentos devem ser
power_rating_wattsedoor_is_open. - No corpo do método
initialize(), para cada argumento, se ele não estivermissing()(docs), então o campo privado correspondente deve ser definido.
- Os argumentos devem ser
- Crie um objeto de micro-ondas com potência de
650watts e porta aberta.- Chame o método
new()demicrowave_oven_factory. - Passe os argumentos
power_rating_watts = 650edoor_is_open = TRUEparanew(). - Atribua o resultado a
a_microwave_oven.
- Chame o método
exercicio interativo prático
Tente este exercicio completando este código de exemplo.
# 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 <- ___