Statische elektriciteit
R6-klassen kunnen het kopiëren-op-referentiegedrag van omgevingen gebruiken om velden tussen objecten te delen. Om dit in te stellen, definieer je een privéveld met de naam shared. Dit veld kost enkele regels om te definiëren. Het moet:
- Een nieuwe omgeving maken.
- Eventuele gedeelde velden aan die omgeving toewijzen.
- De omgeving retourneren.
De gedeelde velden moeten via actieve bindings worden benaderd. Deze werken op dezelfde manier als andere actieve bindings die je hebt gezien, maar halen de velden op met een private$shared$-prefix.
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
}
}
)
)
Let op dat de naam van de actieve binding hetzelfde moet zijn als de naam van het gedeelde veld dat je wilt ophalen of instellen; in het bovenstaande voorbeeld zijn ze allebei a_shared_field.
Deze oefening maakt deel uit van de cursus
Objectgeoriënteerd programmeren met S3 en R6 in R
Oefeninstructies
Er is al deels een MicrowaveOven-klasse voor je gedefinieerd.
- Werk in het private element van de
MicrowaveOven-klasse het veldsharedbij.- Dit veld moet drie regels code bevatten tussen accolades,
{}. - Roep eerst
new.env()(docs) aan om een nieuwe omgevingete maken, en … - Wijs vervolgens in
eeen variabele toe met de naamsafety_warning, met de waarde"Warning. Do not try to cook metal objects.", en … - Retourneer de omgeving.
- Dit veld moet drie regels code bevatten tussen accolades,
- Voeg een actieve binding
safety_warningtoe die het private gedeelde veldsafety_warningophaalt of instelt.- Definieer dit als een functie binnen het element
active. - Deze neemt één argument met de naam
value. - Deze moet
private$shared$safety_warningophalen of instellen.
- Definieer dit als een functie binnen het element
- Maak twee
MicrowaveOven-objecten, met respectievelijk de namena_microwave_ovenenanother_microwave_oven. - Verander het veld
safety_warningopa_microwave_ovennaar"Warning. If the food is too hot you may scald yourself.". - Bekijk het veld
safety_warningopanother_microwave_ovenom te controleren dat dit is aangepast.
Praktische interactieve oefening
Probeer deze oefening eens door deze voorbeeldcode in te vullen.
# 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
___