Насамперед
Існує один спеціальний публічний метод initialize() (зверніть увагу на американський варіант написання). Користувач не викликає його безпосередньо. Натомість він викликається автоматично під час створення об'єкта, тобто коли користувач викликає new().
initialize() дає змогу встановити значення приватних полів під час створення об'єкта R6. Шаблон функції initialize() виглядає так:
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
}
}
)
)
Зверніть увагу на використання missing() (docs). Вона повертає TRUE, якщо аргумент не було передано у виклику функції.
Аргументи методу new() фабрики передаються до initialize().
a_thing <- thing_factory$new(
a_field = "a different value",
another_field = 456
)
Ця вправа є частиною курсу
Об'єктно-орієнтоване програмування з S3 та R6 в R
Інструкції до вправи
Фабрику мікрохвильових печей частково визначено за вас.
- Додайте публічний метод
initialize(). Він має дозволяти користувачеві встановлювати поляpower_rating_wattsіdoor_is_openпід час створення об'єкта.- Аргументи мають бути
power_rating_wattsіdoor_is_open. - У тілі методу
initialize()для кожного аргументу, якщо він неmissing()(docs), встановіть відповідне приватне поле.
- Аргументи мають бути
- Створіть об'єкт мікрохвильової печі з потужністю
650ват і відчиненими дверцятами.- Викличте метод
new()уmicrowave_oven_factory. - Передайте аргументи
power_rating_watts = 650іdoor_is_open = TRUEдоnew(). - Присвойте результат змінній
a_microwave_oven.
- Викличте метод
Інтерактивна практична вправа
Спробуйте виконати цю вправу, доповнивши цей зразок коду.
# 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 <- ___