r - 复制 data.tables 列表

标签 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]

现在我收到以下错误:
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.

我不明白 R 是如何处理复制调用的,以及它们是如何传递给 data.table 的,但不是这样的:(?)

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

因此,我认为不应该有任何错误,我认为它仍然是错误发生的“错误”。那是对的吗?

固件

最佳答案

copy()用于复印 data.table的。您正在使用它复制 list .尝试..

zz <- lapply(z,copy)
zz[[1]][ , newColumn := 1 ]

使用您的原始代码,您将看到应用 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)] 

关于r - 复制 data.tables 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30977679/

相关文章:

用 R 中该行的最新非 NA 值替换特定列中的 NA

r - 使用另一个数据表以主数据表 r 中的列为条件

r - CVXR 使用 Mosek 解决二次最小化问题

r - 无法导入单独行中包含的文本列数据

r - 从现有数据框或数据表创建多个虚拟对象

r - data.table:为什么不能总是总是直接传递列名?

r - 使用 json 路径对 googlesheets4 进行非交互式身份验证

r papaja::printnum(0L, numerals =F) 返回空值,而不是 "zero"

r - 在 R 中编写一个函数来循环方程并在循环中的下一轮中使用最后一个值

r - 将数据帧与 data.table 匹配