我很想知道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
答案 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.frame
和data.table
(这就是您所看到的)以及修改{{1}的方式通过引用是使用data.table
。没有任何重要的环境因素。