2014-09-26 2 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 객체가 복사됩니다.

모든 Portofolio 개체 사이에서 공유 개체로 xts 개체를 만들려고하십니까? 여기

exemple :

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에서 수정하면 시리즈가 R6 객체의 모든 인스턴스에서 공유되는 참조 객체이기 때문에 p1에서 smae 수정을 얻을 수 있습니다.

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' 또는 뭔가 (아직 존재하지 않음)를 만들 정도로 충분한 평판을 얻었습니까? 그것이 제 질문에 추가 될 수 있습니까? –

+1

@DanielKrizian r6 태그가 추가되었습니다. – agstudy

+0

나는 할당 후에 메모리 주소가 바뀌는 것을 발견했다 :'A1 = address (p1 $ series $ x); p2 $ series $ x [ "1970-01-03"] <- 10; A2 = 주소 (p1 $ series $ x); same (A1, A2) # FALSE' 그러므로'xts'에 값을 쓰는 작업을하는 것은'data.table' 접근법에 비해 값이 비싸고 연산 속도가 느립니다 :'DT [a == 1, b : = 10]'? 어떤 데이터 구조를 사용해야한다고 생각하십니까 –