为什么我会收到恼人的警告?
initialize = function() {
table = data.table(1:10)
colnames(table) <- "old.col"
table
}
dt <- initialize()
dt[, new.col := 5]
答案 0 :(得分:3)
警告消息告诉您所需的一切:
警告讯息:
[.data.table
(dt, , `:=`(new.col, 5))
:
通过(浅)检测并修复无效的.internal.selfref data.table的副本,以便:=可以添加此新列 参考。在较早的时候,这个data.table已被R复制 (或使用structure()
或类似手动创建)。避免key<-
, 目前(并且奇怪地)在R中的names<-
和attr<-
可以复制整个 data.table。请改用set *语法以避免复制:?set
,?setnames
和?setattr
。此外,在R&lt; = v3.0.2中,列表(DT1,DT2)复制了整个DT1 和DT2(R'list()
用于复制命名对象);请升级到 R> v3.0.2如果是咬人的话。如果此消息没有帮助,请 向datatable-help报告,以便修复根本原因。
.internal.selfref
指针指的是data.table
内存中的位置。使用key<-
,names<-
或attr<-
可能会导致R复制需要在内存中另一个位置的data.table
。
因此,您应该使用colnames
:
setnames
initialize = function() {
table = data.table(1:10)
setnames(table,"V1","old.col")
table
}
dt <- initialize()
dt[, new.col := 5]
现在您不会收到警告,因为data.table
是通过引用更新的,无需复制,因此保持指向内存中位置的.internal.selfref
指针。