< - ,[[< - ,$< - 和:=与环境

时间:2014-03-06 09:25:32

标签: r data.table

我很想知道data.tablea在环境方面的行为是否不一致。使用data.tables时,期望为data.table分配一个新变量不会复制数据,而是创建一个指向现有表的新指针。当源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未指向({1}}的(相同值)。它制作了一份副本。这不是我对 data.table 所期望的。我希望data.tables更像单例,其中只有一个数据副本存在,除非有明确的mydata

此外,copy$<-会导致在全局环境中进行复制。 [[<-$<<-没有(正如预期的那样)。此外,[[<<-不会导致复制。

这与 data.table 的意图不一致吗?

此行为是否与 data.table

不一致

R版本信息:

  

R.version                  _
  平台x86_64-unknown-linux-gnu
  拱x86_64
  os linux-gnu
  system x86_64,linux-gnu
  状态
  专业3   小0.1   2013年   月05日   第16天   svn rev 62743
  语言R
  version.string R版本3.0.1(2013-05-16)   昵称Good Sport

1 个答案:

答案 0 :(得分: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,...

当你执行mydata时,你的mydata2 <- mydata都没有被复制(你可以使用上述方法再次检查,或者在分配后立即尝试像mydata[, y := 5]这样的smth,看看它是怎么回事改变两个表。)

另一方面[[<-以及过多的其他赋值运算符都会复制data.framedata.table(这就是您所看到的)以及修改{{1}的方式通过引用是使用data.table。没有任何重要的环境因素。