【发布时间】:2015-09-23 21:41:43
【问题描述】:
背景
我尝试将一些CSV 输出文件替换为rds 文件以提高效率。这些是中间文件,将作为其他 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'
我在 Linux Mint 上运行 R 版本 3.2.0,并使用 data.table 版本 1.9.4 和 1.9.5(最新)进行了测试。
在 SO 和 google 中搜索返回 this 和 this 但我认为他们没有回答这个问题。当我切换到rds 时,我仍在试图弄清楚为什么我的脚本失败了,但我是从这个开始的。
如果知识渊博的 SO 成员能提供帮助,我们将不胜感激。谢谢!
编辑:
大家好,我碰巧找到了解决问题的方法 - 已在下面发布了解决方案。我很抱歉,如果它相当不雅。现在,我还有 2 个问题:
(1) 有没有更好的方法?
(2) 可以在R 和/或data.table 代码处解决此问题吗?我的意思是,这个问题会导致不可预知的错误,而不是首先想到的。我的 2 美分值。
【问题讨论】:
-
然后
all.equal(aDT, bDT)#TRUE -
嗯...好点...我一直只使用
identical。通过 ?all.equal表明这是对“近似相等”的测试,所以也许区别在于下面两位先生提到的指针?
标签: r save load data.table