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