将新列添加到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"
这是一个错误还是我做错了什么?我正在使用1.9.6data.table包.
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中随机为0; 也就是说,在两种情况下都可能出乎 data.table检测此状态,并在下一列添加或删除发生时过度分配已加载的data.table.data.table上的所有其他操作(例如快速分组和连接)不需要truelength.
由于在删除列期间不会发生复制,因此文档似乎略有过时.
请注意,如果添加的列数多于在"正常"创建data.table期间过度分配的列,则也会发生副本.