ПочатиПочніть безкоштовно

Насамперед

Існує один спеціальний публічний метод 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 <- ___
Редагувати та запускати код