当新列添加到从磁盘加载的data.table
时,它会被复制。
library('data.table')
dt <- data.table(a=1,b=2)
save.image("test.RData")
load("test.RData")
dt
$ a b
$1: 1 2
class(dt)
$[1] "data.table" "data.frame"
address(dt)
$[1] "00000000046F1F38"
dt[, b := NULL]
address(dt)
$[1] "00000000046F1F38"
dt[, c := 2]
address(dt)
$[1] "000000000D815618"
这是一个错误还是我做错了什么?我正在使用data.table包的1.9.6
。
答案 0 :(得分:9)
data.table通过在创建data.table时为列向量列表过度分配指针槽来添加列时避免复制。当您像这样加载data.table时,过度分配没有发生,并且在添加列后完成。这需要一份副本。
library('data.table')
dt <- data.table(a=1,b=2)
save.image("test.RData")
load("test.RData")
truelength(dt)
#[1] 0
dt[, b := NULL]
truelength(dt)
#[1] 0
dt[, c := 2]
truelength(dt)
#[1] 101
引用help("truelength")
:
对于从磁盘加载的表,但是,在R 2.14.0中,truelength为0,在R <= 2.13.2中为随机;也就是说,在这两种情data.table检测此状态,并在下一列添加或删除发生时过度分配已加载的data.table。 data.table上的所有其他操作(例如快速分组和连接)不需要truelength。
由于在删除列期间没有发生复制,因此文档似乎略有过时。
请注意,如果添加的列数多于在“正常”创建data.table期间过度分配的列,则也会发生副本。