【问题标题】:Shallow and deep copy of R6 elements in a list列表中 R6 元素的浅拷贝和深拷贝
【发布时间】:2021-04-20 08:37:34
【问题描述】:

这是一个简单的 R6Class

C = R6::R6Class(
    "C",
    public = list(
        x = NULL,

        initialize = function(x)
        {
            self$x=x
        }
    )
)

默认情况下clone 方法采用deep=FALSE(我不知道如何重新定义clone 来改变它)。我正在处理lists 类C 的实例。在复制这些列表时,有时我想通过引用复制其中的C 对象,有时我想深度复制它们。

这里是一个引用复制的例子

A = list(a1 = C$new(1), a2 = C$new(2))
B = A

print(B[["a1"]]$x) # [1]
A[["a1"]]$x = 4
print(B[["a1"]]$x) # [4]

不过,我正在努力深度复制列表。我可以的

A = list(a1 = C$new(1), a2 = C$new(2))
B = list(a1=A[["a1"]]$clone(deep=TRUE), a2=A[["a2"]]$clone(deep=TRUE))

print(B[["a1"]]$x) # [1]
A[["a1"]]$x = 4
print(B[["a1"]]$x) # [1]

但是这种技术并不理想,因为我不需要知道列表中每个元素的名称。有什么方便的方法吗

B = copy_Cinstances_by_reference(A)

B = deep_copy_Cinstances(A)

?

【问题讨论】:

    标签: r reference copy deep-copy r6


    【解决方案1】:

    您可以通过 for 循环一个一个地复制列表中的每个元素。我想这可能会在处理大型列表时以性能为代价,而且它可能不是最干净的方法。

    A = list(a1 = C$new(1), a2 = C$new(2))    
    
    B = list()
    for (name in names(A))
    {
        B[[name]] = A[[name]]$clone(deep=TRUE)
    }
    
    print(B[["a1"]]$x) # [1]
    A[["a1"]]$x = 4
    print(B[["a1"]]$x) # [1]
    

    【讨论】:

      猜你喜欢
      • 2012-04-12
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多