R - readRDS()和load()无法提供与原始数据相同的data.tables

Nov*_*rog 13 load r save data.table

背景

我试图CSVrds文件替换一些输出文件以提高效率.这些是中间文件,将作为其他R脚本的输入.

我开始调查我的脚本何时失败并发现readRDS()并且load()不会返回与data tables原始脚本相同的脚本.这应该发生吗?还是我错过了什么?

示例代码

library( data.table )

aDT <- data.table( a=1:10, b=LETTERS[1:10] )
saveRDS( aDT, file = "aDT.rds")
bDT <- readRDS( file = "aDT.rds" )
identical( aDT, bDT, ignore.environment = T )  # Gives 'False'

aDF <- data.frame( a=1:10, b=LETTERS[1:10] )
saveRDS( aDF, file = "aDF.rds")
bDF <- readRDS( file = "aDF.rds" )
identical( aDF, bDF, ignore.environment = T )  # Gives 'True'

# Using 'save'& 'load' doesn't help either
aDT2 <- data.table( a=1:10, b=LETTERS[1:10] )
save( aDT2, file = "aDT2.RData")
bDT2 <- aDT2; rm( aDT2 )
load( file = "aDT2.RData" )
identical( aDT2, bDT2, ignore.environment = T )  # Gives 'False'
Run Code Online (Sandbox Code Playgroud)

我在Linux Mint上运行R ver 3.2.0并且已经使用data.tablever 1.9.4和1.9.5(最新版本)进行了测试.

在SO和谷歌搜索返回这个这个,但我不认为他们回答这个问题.我仍然试图弄清楚为什么我的脚本在切换到时失败了,rds但我从这开始.

如果知识渊博的SO成员可以提供帮助,我将非常感激.谢谢!

编辑:

大家好,我碰巧找到了解决问题的方法 - 已经发布了以下解决方案.如果它相当不优雅,我道歉.现在,我还有两个问题:

(1)有更好的方法吗?

(2)可以在R和/或data.table代码处完成某些事情来解决这个问题吗?我的意思是,这个问题导致不可预测的错误,并不是第一个浮现在脑海中的东西.我的2美分价值.

pic*_*ick 3

新加载的data.table不知道已加载的指针值。你可以告诉它

attributes(bDT)$.internal.selfref <- attributes(aDT)$.internal.selfref
identical( aDT, bDT, ignore.environment = T )
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)

data.frame不要保留此属性,可能是因为它们没有进行就地修改。