2014-03-06 193 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的方法是使用:=。上面的环境都不重要。