“无效.internal.selfref”警告NO CALLING list()INVOLVED

时间:2015-12-22 10:24:54

标签: r reference data.table

为什么我会收到恼人的警告?

initialize = function() {
table = data.table(1:10)
colnames(table) <- "old.col"
table
}
dt <- initialize()
dt[, new.col := 5]

1 个答案:

答案 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指针。