列表中 R6 元素的浅拷贝和深拷贝
Shallow and deep copy of R6 elements in a list
这是一个简单的 R6Class
C = R6::R6Class(
"C",
public = list(
x = NULL,
initialize = function(x)
{
self$x=x
}
)
)
默认情况下,clone
方法采用 deep=FALSE
(我不知道如何重新定义 clone
来改变它)。我正在处理 class C
的 list
个实例。复制这些列表时,有时想通过引用复制其中的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)
?
您可以通过 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]
这是一个简单的 R6Class
C = R6::R6Class(
"C",
public = list(
x = NULL,
initialize = function(x)
{
self$x=x
}
)
)
默认情况下,clone
方法采用 deep=FALSE
(我不知道如何重新定义 clone
来改变它)。我正在处理 class C
的 list
个实例。复制这些列表时,有时想通过引用复制其中的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)
?
您可以通过 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]