【发布时间】:2014-03-06 09:25:32
【问题描述】:
我很想知道 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 不指向(相同的值)mydata。它制作了一个副本。这不是我对 data.table 的期望。我希望 data.tables 表现得更像单例,其中只有一个数据副本存在,除非创建明确的 copy。
此外,$<- 和 [[<- 会导致在全局环境中进行复制。 $<<- 和 [[<<- 没有(如预期的那样)。此外,:= 不会生成副本。
这是否与 data.table 的意图不一致?
这种行为是否与 data.table 不一致?
R 版本信息:
R.版本 _
平台 x86_64-unknown-linux-gnu
拱 x86_64
操作系统 linux-gnu
系统 x86_64, linux-gnu
状态
专业 3
次要 0.1
2013 年
05月
第 16 天
svn 版本 62743
语言 R
version.string R 版本 3.0.1 (2013-05-16) 昵称好运动
【问题讨论】:
-
<-与data.table没有任何不同。您需要使用data.table提供的:=运算符和set*函数通过引用来执行操作。另见stackoverflow.com/questions/10225098/… 和?":="。只要您使用:=和set*,您的期望就是正确的。 -
哦,我明白了。感谢您提供关于 DT 行为的清晰和指向先前答案的链接。我会说这种行为有点不一致/出乎意料,尽管我认识到这是您必须处理的限制。大包顺便说一句。
标签: r data.table