クローンの逆襲 (2)
R6 オブジェクトが、そのフィールドの一部または全部に別の R6 オブジェクトを含む場合、既定では clone() はそれらの R6 フィールドを参照でコピーします。これらの R6 フィールドを値でコピーするには、clone() メソッドに引数 deep = TRUE を指定して呼び出す必要があります。
a_deep_copy <- an_r6_object$clone(deep = TRUE)
この演習はコースの一部です
R における S3 と R6 を使ったオブジェクト指向プログラミング
演習の手順
電子レンジの電源プラグを表す PowerPlug R6 クラスが、ワークスペースにあらかじめ用意されています。MicrowaveOven クラスは PowerPlug オブジェクトを含むように更新されています。
MicrowaveOvenオブジェクトを作成し、a_microwave_ovenに代入します。- 引数なしで
clone()メソッドを使い、電子レンジをcloned_microwave_ovenという変数にコピーします。 clone()メソッドにdeep = TRUEを渡して、電子レンジをdeep_cloned_microwave_ovenという変数にコピーします。a_microwave_ovenのpower_plugフィールドのtypeを"British"に変更します。a_microwave_ovenとcloned_microwave_ovenのpower_plug$typeフィールドが同一であることを確認します。a_microwave_ovenとdeep_cloned_microwave_ovenのpower_plug$typeフィールドが異なることを確認します。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# 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(___, ___)