Atak klonów (2)
Jeśli obiekt R6 zawiera inny obiekt R6 w jednym lub kilku swoich polach, to domyślnie metoda clone() kopiuje te pola R6 przez referencję. Aby skopiować je przez wartość, należy wywołać metodę clone() z argumentem deep = TRUE.
a_deep_copy <- an_r6_object$clone(deep = TRUE)
To ćwiczenie jest częścią kursu
Programowanie obiektowe z S3 i R6 w R
Instrukcje do ćwiczenia
W twoim środowisku pracy jest już zdefiniowana klasa R6 PowerPlug, opisująca wtyczkę sieciową kuchenki mikrofalowej. Klasa MicrowaveOven została zaktualizowana i zawiera teraz obiekt PowerPlug.
- Utwórz obiekt klasy
MicrowaveOveni przypisz go do zmienneja_microwave_oven. - Skopiuj kuchenkę do zmiennej
cloned_microwave_oven, używając metodyclone()bez żadnych argumentów. - Skopiuj kuchenkę do zmiennej
deep_cloned_microwave_oven, używając metodyclone()z argumentemdeep = TRUE. - Zmień pole
typew polupower_plugobiektua_microwave_ovenna"British". - Sprawdź, czy pola
power_plug$typeobiektówa_microwave_ovenicloned_microwave_ovensą identyczne. - Sprawdź, czy pola
power_plug$typeobiektówa_microwave_ovenideep_cloned_microwave_ovenróżnią się od siebie.
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
# 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(___, ___)