Статична електрика
Класи R6 можуть використовувати копіювання за посиланням для середовищ, щоб спільно використовувати поля між обʼєктами. Щоб це налаштувати, визначте приватне поле з назвою shared. Це поле задається кількома рядками. Воно має:
- Створити нове середовище.
- Присвоїти цьому середовищу всі спільні поля.
- Повернути це середовище.
До спільних полів слід звертатися через активні привʼязування. Вони працюють так само, як і інші активні привʼязування, які ви вже бачили, але отримують поля з префіксом private$shared$.
R6Class(
"Thing",
private = list(
shared = {
e <- new.env()
e$a_shared_field <- 123
e
}
),
active = list(
a_shared_field = function(value) {
if(missing(value)) {
private$shared$a_shared_field
} else {
private$shared$a_shared_field <- value
}
}
)
)
Зверніть увагу: назва активного привʼязування має збігатися з назвою спільного поля, яке ви хочете зчитати або встановити; в наведеному вище прикладі обидва мають назву a_shared_field.
Ця вправа є частиною курсу
Об'єктно-орієнтоване програмування з S3 та R6 в R
Інструкції до вправи
Клас MicrowaveOven частково визначено за вас.
- У приватному елементі класу
MicrowaveOvenоновіть поле з назвоюshared.- Це поле має містити три рядки коду в дужках
{}. - Спершу викличте
new.env()(docs), щоб створити нове середовище з назвоюe, потім … - Присвойте в
eзмінну з назвоюsafety_warningзі значенням"Warning. Do not try to cook metal objects.", потім … - Поверніть середовище.
- Це поле має містити три рядки коду в дужках
- Додайте активне привʼязування з назвою
safety_warning, яке зчитує або встановлює приватне спільне полеsafety_warning.- Визначте це як функцію всередині елемента
active. - Вона приймає єдиний аргумент з назвою
value. - Вона має зчитувати або встановлювати
private$shared$safety_warning.
- Визначте це як функцію всередині елемента
- Створіть два обʼєкти
MicrowaveOvenз іменамиa_microwave_ovenтаanother_microwave_ovenвідповідно. - Змініть поле
safety_warningвa_microwave_ovenна"Warning. If the food is too hot you may scald yourself.". - Перегляньте поле
safety_warningвanother_microwave_oven, щоб переконатися, що його змінено.
Інтерактивна практична вправа
Спробуйте виконати цю вправу, доповнивши цей зразок коду.
# Complete the class definition
microwave_oven_factory <- R6Class(
"MicrowaveOven",
private = list(
shared = {
# Create a new environment named e
___
# Assign safety_warning into e
___
# Return e
___
}
),
active = list(
# Add the safety_warning binding
safety_warning = ___(___) {
if(___(___)) {
___
} else {
___ <- ___
}
}
)
)
# Create two microwave ovens
a_microwave_oven <- ___
another_microwave_oven <- ___
# Change the safety warning for a_microwave_oven
___ <- "Warning. If the food is too hot you may scald yourself."
# Verify that the warning has change for another_microwave
___