让我们:
library(R6); library(data.table); library(xts)
Portfolio <- R6Class("Portfolio",
public = list(name="character",
prices = NA,
initialize = function(name, instruments) {
if (!missing(name)) self$name <- name
}
))
p = Portfolio$new("ABC")
DT = data.table(a=1:3, b=4:6)
X = xts(1:4, order.by=as.Date(1:4))
如果我们将data.table分配给对象槽然后修改外部数据表,那么对象槽中的数据表也会被引用修改:
p$prices = DT
p$prices
DT[a==1,b:=10] # modify external table
p$prices # verify that the slot data is modified by reference
让我们用xts做一个类似的实验:
p$prices = X
p$prices
X["1970-01-03"] <- 10 # modify the external xts
p$prices # observe that modification didn't take place inside the object
与data.table不同,以这种方式在对象槽内分配xts对象似乎打破了插槽和外部对象之间的链接.
是否有可能实现xts通过引用共享?
最佳答案 这里显示的内容与data.table赋值行为有关,在任何情况下都与R6类有关.实际上,data.table赋值是通过引用完成的(独立地在R6字段中复制)或者只是复制xts对象.
您是否希望将xts对象创建为所有Portofolio对象之间的共享对象?
这里有一个例子:
XtsClass <- R6Class("XtsClass", public = list(x = NULL))
Portfolio <- R6Class("Portfolio",
public = list(
series = XtsClass$new()
)
)
p1 <- Portfolio$new()
p1$series$x <- xts(1:4, order.by=as.Date(1:4))
p2 <- Portfolio$new()
p2和p1共享相同的xts对象.现在,如果你在p2中修改它,你将在p1中得到smae修改,因为series是一个在R6对象的所有实例之间共享的引用对象.
p2$series$x["1970-01-03"] <- 10
p1$series$x
[,1]
1970-01-02 1
1970-01-03 10 ## here the modification
1970-01-04 3
1970-01-05 4