【问题标题】:xts assignment by referencexts 引用赋值
【发布时间】:2014-09-26 07:35:45
【问题描述】:

让我们来:

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 通过引用共享?

【问题讨论】:

    标签: r data.table xts r6


    【解决方案1】:

    您在这里展示的内容实际上与 data.table 分配行为有关,并且无论如何都与 R6 类有关。实际上,data.table 的赋值是通过引用完成的(独立于在 R6 字段中复制的)或只是复制 xts 对象。

    您是否希望创建一个 xts 对象作为所有 Portfolio 对象之间的共享对象?

    这里是一个例子:

        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 修改,因为系列是在 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
    

    【讨论】:

    • 嗯,有趣,谢谢!另外,您是否有足够的声誉来创建新标签 R6 或其他东西(尚不存在),以便可以将其添加到我的问题中?
    • @DanielKrizian r6 标签已添加。
    • 我注意到分配后内存地址发生了变化:A1 = address(p1$series$x); p2$series$x["1970-01-03"] &lt;- 10; A2 = address(p1$series$x); identical(A1, A2) # FALSE 因此写入xts 对象是一项昂贵的操作,并且相对于data.table 方法更慢:DT[a==1,b:=10]?思考我应该采用什么数据结构
    • 我不知道 R6 对象的幕后究竟发生了什么。重新评价您的评论,我认为您正在寻找高性能行为, data.table 似乎是一个自然的选择。但与往常一样,这是一种妥协,如果您将其作为时间序列对象(时间子设置/滚动/)进行操作,也许您应该使用xts 包。还要注意使用引用类,不会提高性能(仅内存),但当然你会得到更好的设计代码。
    猜你喜欢
    • 2013-02-17
    • 2023-04-06
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多