克隆人的进击 (2)
如果一个 R6 对象在其一个或多个字段中包含另一个 R6 对象,则默认情况下,clone() 会按引用复制这些 R6 字段。若要按值复制这些 R6 字段,必须以参数 deep = TRUE 调用 clone() 方法。
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(___, ___)