始める無料で始める

クローンの逆襲 (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_ovenpower_plug フィールドの type"British" に変更します。
  • a_microwave_ovencloned_microwave_ovenpower_plug$type フィールドが同一であることを確認します。
  • a_microwave_ovendeep_cloned_microwave_ovenpower_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(___, ___)  
コードを編集して実行