复制data.tables列表

Fab*_*ner 5 r data.table

我有以下情况:

1)数据表列表

2)出于测试目的,我故意(深入)复制整个列表,包括数据表

3)我想从复制的列表中取一些元素并添加一个新列.

这是代码:

library(data.table)
x = data.table(aaa = c(1,2))
y = data.table(bbb = c(1,2))
z = list(x,y)
zz = copy(z)

v = zz[[1]]
v = v[, newColumn := 1]
Run Code Online (Sandbox Code Playgroud)

现在我收到以下错误:

Error in `[.data.table`(res, , `:=`(xxx, TRUE)) : 
(converted from warning) Invalid .internal.selfref detected and fixed
by taking a copy of the whole table so that := can add this new column 
by reference. At an earlier point, this data.table has been copied by R 
(or been created manually using structure() or similar). Avoid key<-, 
names<- and attr<- which in R currently (and oddly) may copy the whole 
data.table. Use set* syntax instead to avoid copying: ?set, ?setnames 
and ?setattr. Also, in R<=v3.0.2, list(DT1,DT2) copied the entire DT1 
and DT2 (R's list() used to copy named objects); please upgrade to 
R>v3.0.2 if that is biting. If this message doesn't help, please report 
to datatable-help so the root cause can be fixed.
Run Code Online (Sandbox Code Playgroud)

我不确切地理解R如何处理复制调用以及如何将它们传递给data.table但是它不是这样的:(?)

如果某人明确地使用了复制功能,那么他/她就会意识到"按值"和"按引用"之间存在差异.所以他/她应该分发出对象的真实副本.

因此,我认为不应该有任何错误,我认为这是错误发生的"错误".那是对的吗?

FW

Sim*_*lon 5

copy()是复制data.table的.您正在使用它来复制list.尝试..

zz <- lapply(z,copy)
zz[[1]][ , newColumn := 1 ]
Run Code Online (Sandbox Code Playgroud)

使用你原来的代码,你会看到,申请copy()list不使原件及复印件data.table.它们仍被内存中的相同位置引用:

library(data.table)
x = data.table(aaa = c(1,2))
y = data.table(bbb = c(1,2))
z = list(x,y)
zz = copy(z)

#  Both zz$x and z$x are the same object:
.Internal(inspect(zz$x))
#  @7fd58a079778 00 NILSXP g1c0 [MARK,NAM(2)] 
.Internal(inspect(z$x))
#  @7fd58a079778 00 NILSXP g1c0 [MARK,NAM(2)] 
Run Code Online (Sandbox Code Playgroud)

  • @Arun:完成.(再次感谢这个精彩的包装:-)) (3认同)
  • @FabianWerner,`copy()`旨在处理所有对象,因为它只是从R的C-API调用`duplicate()`.但是,我们没有预料到list-of-data.tables的用法,就好像你看看`copy()`一样,它调用了`alloc.col()`.我认为我们需要修复data.tables列表的情况,或者限制为原子向量/ data.frames/data.tables和/或记录它.你能否在github页面上提交一个问题,标题为"copy()在data.tables问题列表上"并简单地链接到这篇文章?谢谢. (2认同)