只是为了自己清理一些东西,我想更好地理解何时创建副本以及何时不在data.table
中。由于这个问题指出Understanding exactly when a data.table is a reference to (vs a copy of) another data.table,如果简单地运行下列那么你最终修改原始:了解data.table的参考属性R
library(data.table)
DT <- data.table(a=c(1,2), b=c(11,12))
print(DT)
# a b
# [1,] 1 11
# [2,] 2 12
newDT <- DT # reference, not copy
newDT[1, a := 100] # modify new DT
print(DT) # DT is modified too.
# a b
# [1,] 100 11
# [2,] 2 12
然而,如果做到这一点(例如),那么你最终修改的新版本:
DT = data.table(a=1:10)
DT
a
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9
10: 10
newDT = DT[a<11]
newDT
a
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9
10: 10
newDT[1:5,a:=0L]
newDT
a
1: 0
2: 0
3: 0
4: 0
5: 0
6: 6
7: 7
8: 8
9: 9
10: 10
DT
a
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9
10: 10
据我了解,之所以出现这种情况是因为当你执行i
声明,data.table
返回一个全新的表,而不是由旧data.table
选择元素所占用的内存的引用。这是正确和真实的吗?
编辑:对不起,我的意思i
没有j
(高于此改变)
即使'newDT < - DT [x <11]'也会创建一个副本。通过子集创建'newDT'后,'newDT [,b:= 5]'。使用'tracemem'和'.Internal(inspect(。))'是理解这一点的信息工具。 – Arun 2013-04-08 22:39:15
@阿伦:对不起,我不确定我是否理解你的观点。你能解释一下你指的是什么吗?你的意思是说第一个例子和第二个例子会一样吗?在那种情况下是的 - 这是真的。我只是想要一个单独的例子来说清楚。 – Alex 2013-04-08 22:42:06
当然,你能解释一下你指的是哪个'j'语句:'据我了解,这种情况发生的原因是因为当你执行一个j语句时,只是为了确定。我会用我之前谈论的内容写一个答案。 – Arun 2013-04-08 22:46:27