2014-03-06 248 views
1

我很想知道data.tablea相對於環境的行爲是否不一致。使用data.tables時,期望將一個新變量分配給data.table不會複製數據,但會爲現有表創建一個新指針。當源數據表存在於另一個環境中時,這看起來並不正確。例如,

> attach(new.env(), name="dt") 
> e <- as.environment("dt") 
> 
> assign("mydata", data.table(x=1:3, y=1), e) 
> mydata 
    x y 
1: 1 1 
2: 2 1 
3: 3 1 
> ls() 
[1] "e"  

如果我們嘗試並分配一個新的名稱mydata,我們沒有得到有指向同一數據的預期行爲。

mydata2 <- mydata  # also makes a _copy_ 
mydata2[['y']] <- 5 # change the data 
identical(mydata2, mydata) 
> FALSE 

mydata2不指向(相同值)作爲mydata。它做了一個副本。這不是我所期望的data.table。我期望data.tables的行爲更像單數據,其中只有一個數據副本存在,除非明確copy

另外,$<-[[<-會導致在全球環境中進行復制。 $<<-[[<<-不(如預期的那樣)。此外,:=不會導致複製。

這是否與data.table的意圖不一致?

這種行爲是否與data.table不一致?

[R版本信息:

R.version _
平臺x86_64的未知-Linux的GNU
拱x86_64的
OS的Linux-GNU
系統x86_64的,Linux的GNU
狀態
major 3
minor 0.1
年2013
月05
日16
SVN修訂版62743
咒罵r
version.string [R版本3.0.1(2013年5月16日) 綽號很好的運動

+1

對於'data.table','<-'沒有什麼不同。您需要使用data.table提供的':='運算符和'set *'函數來引用。另見http://stackoverflow.com/questions/10225098/understanding-exactly-when-a-data-table-is-a-reference-to-vs-a-copy-of-another和'?「:=」 '。只要你使用':='和'set *',你的期望就是正確的。 –

+0

哦,我現在明白了。感謝您提供有關DT行爲的先前答案的清晰性和鏈接。我會說這種行爲有點不一致/意外,儘管我認識到這是一個你必須處理的限制。大包順便說一句。 – ctbrown

回答

2

運營商<-=做R中副本中的所有對象:

a = c(1:10) 
.Internal(inspect(a)) 
#@0x000000001072aa28 13 INTSXP g0c4 [NAM(1)] (len=10, tl=0) 1,2,3,4,5,... 
b = a 
.Internal(inspect(b)) 
#@0x000000001072aa28 13 INTSXP g0c4 [NAM(2)] (len=10, tl=0) 1,2,3,4,5,... 

當你做mydata2 <- mydata時(你可以使用上面的方法重新檢查一次,或者在分配後立即嘗試像mydata[, y := 5]這樣的無效值並查看如何更改這兩個表)來複制mydata

在另一方面[[<-和其他賦值運算符的大量複製做兩個data.framedata.table(這就是你所看到的),並參照修改data.table的方法是使用:=。上面的環境都不重要。