2014-09-26 21 views
4

讓我們:XTS分配

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 

在對象槽內部指定xts對象似乎破壞了槽和外部對象之間的鏈接,與data.table不同。

是否可以通過引用來共享xts

回答

2

這裏顯示的內容實際上與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 
+1

嗯,有趣,謝謝!另外,你是否有足夠的聲望來創建新的標籤'R6'或什麼(還不存在),以便它可以添加到我的問題? – 2014-09-26 09:40:22

+1

@DanielKrizian r6標籤添加。 – agstudy 2014-09-26 15:06:14

+0

我注意到內存地址在賦值後發生了變化:'A1 = address(p1 $ series $ x); p2 $ series $ x [「1970-01-03」] < - 10; A2 =地址(p1 $ series $ x);相同的(A1,A2)#FALSE'因此寫入'xts'對象是一個代價高昂的操作,並且相對於'data.table'方法更慢:'DT [a == 1,b:= 10]'?思考我應該採用什麼數據結構 – 2014-09-29 22:25:56