R 当引用类对象的初始化对象发生更改时,引用类对象的列表不会更改

R 当引用类对象的初始化对象发生更改时,引用类对象的列表不会更改,r,reference-class,R,Reference Class,我有一个引用类对象的列表,我希望当我更改列表初始化时使用的其中一个对象时,列表中相应的条目也应该更改。如以下示例代码所示,如果我列出了正方形和三角形,然后将正方形更改为八角形,则情况并非如此。列表仍将分别具有4边和3边的多边形。反之亦然。如果更改列表的元素,则初始变量保持不变。有人知道为什么会这样吗?或者有没有办法解决这个问题?谢谢 Polygon <- setRefClass("Polygon", fields = c("sides")) square <- Polygon$new

我有一个引用类对象的列表,我希望当我更改列表初始化时使用的其中一个对象时,列表中相应的条目也应该更改。如以下示例代码所示,如果我列出了
正方形
三角形
,然后将
正方形
更改为
八角形
,则情况并非如此。列表仍将分别具有4边和3边的多边形。反之亦然。如果更改列表的元素,则初始变量保持不变。有人知道为什么会这样吗?或者有没有办法解决这个问题?谢谢

Polygon <- setRefClass("Polygon", fields = c("sides"))
square <- Polygon$new(sides = 4)
triangle <- Polygon$new(sides = 3)
octagon <- Polygon$new(sides = 8)

pList <-list(square,triangle)

print(pList)
# [[1]] Reference class object of class "Polygon"
# Field "sides": [1] 4
# [[2]]    # Reference class object of class "Polygon"
# Field "sides":  [1] 3

square<-octagon
# Reference class object of class "Polygon"
# Field "sides":  [1] 8

square #the variable square changes
# Reference class object of class "Polygon"
# Field "sides": [1] 8

pList # but the entry in pList does now.
# [[1]] Reference class object of class "Polygon"
# Field "sides": [1] 4
# [[2]] Reference class object of class "Polygon"
# Field "sides":  [1] 3

#the same is true the other way around, changing the item corresponding to triangle in the list, 
#does not change the object triangle
triangle$sides #3
pList[[2]]$sides #3
pList[2]<-octagon
pList[[2]]$sides #8
triangle$sides #3

Polygon列表项是值,而不是引用/指针。ReferenceClass对象引用(或指向)与其关联的数据(即字段)

如果要编辑列表中的“类指针”,而不直接接触列表对象,则新的“PolygonPointer”类可以作为一种解决方法:

PolygonPointer <- setRefClass("PolygonPointer", fields = list(target = "Polygon"))

pointer1 <- PolygonPointer(target = square)
pointer2 <- PolygonPointer(target = triangle)

lst <- list(pointer1, pointer2)

pointer1$target <- octagon
但是请注意,这样的构造是危险的——例如,默认的复制构造函数执行“深度复制”,同时复制指向的对象。例如:

pointer3 <- pointer1$copy()
pointer3 <- triangle
pointer1 # still points to the octagon

pointer3列表项是值,而不是引用/指针。ReferenceClass对象引用(或指向)与其关联的数据(即字段)

如果要编辑列表中的“类指针”,而不直接接触列表对象,则新的“PolygonPointer”类可以作为一种解决方法:

PolygonPointer <- setRefClass("PolygonPointer", fields = list(target = "Polygon"))

pointer1 <- PolygonPointer(target = square)
pointer2 <- PolygonPointer(target = triangle)

lst <- list(pointer1, pointer2)

pointer1$target <- octagon
但是请注意,这样的构造是危险的——例如,默认的复制构造函数执行“深度复制”,同时复制指向的对象。例如:

pointer3 <- pointer1$copy()
pointer3 <- triangle
pointer1 # still points to the octagon
pointer3