Klonernas attack (2)
Om ett R6-objekt innehåller ett annat R6-objekt i ett eller flera av sina fält, kopierar clone() som standard R6-fälten via referens. För att kopiera dessa R6-fält via värde måste metoden clone() anropas med argumentet deep = TRUE.
a_deep_copy <- an_r6_object$clone(deep = TRUE)
Den här övningen är en del av kursen
Objektorienterad programmering med S3 och R6 i R
Övningsinstruktioner
R6-klassen PowerPlug, som beskriver mikrovågsugnarens strömkontakt, är fördefinierad i din miljö. Klassen MicrowaveOven har uppdaterats och innehåller nu ett PowerPlug-objekt.
- Skapa ett
MicrowaveOven-objekt och tilldela det tilla_microwave_oven. - Kopiera mikrovågsugnen till en variabel med namnet
cloned_microwave_ovenmed hjälp av metodenclone(), utan några argument. - Kopiera mikrovågsugnen till en variabel med namnet
deep_cloned_microwave_ovenmed hjälp av metodenclone(), och skicka meddeep = TRUE. - Ändra fältet
typei fältetpower_plugföra_microwave_oventill"British". - Kontrollera att fälten
power_plug$typeföra_microwave_ovenochcloned_microwave_ovenär identiska. - Kontrollera att fälten
power_plug$typeföra_microwave_ovenochdeep_cloned_microwave_ovenär olika.
Interaktiv övning med praktiskt arbete
Testa den här övningen genom att slutföra den här exempelkoden.
# Create a microwave oven
a_microwave_oven <- microwave_oven_factory$new()
# Look at its power plug
a_microwave_oven$power_plug
# Copy a_microwave_oven using clone(), no args
cloned_microwave_oven <- ___
# Copy a_microwave_oven using clone(), deep = TRUE
deep_cloned_microwave_oven <- ___
# Change a_microwave_oven's power plug type
___$___ <- ___
# Check a_microwave_oven & cloned_microwave_oven same
identical(___, ___)
# Check a_microwave_oven & deep_cloned_microwave_oven different
identical(___, ___)