我很想知道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日) 绰号很好的运动
对于'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 *',你的期望就是正确的。 –
哦,我现在明白了。感谢您提供有关DT行为的先前答案的清晰性和链接。我会说这种行为有点不一致/意外,尽管我认识到这是一个你必须处理的限制。大包顺便说一句。 – ctbrown