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

标签 r save load data.table

背景

我试图更换一些 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 ver 3.2.0 并且已经测试过 data.table版本 1.9.4 和 1.9.5(最新)。

在 SO 和 google 中搜索返回 thisthis但我认为他们没有回答这个问题。当我切换到 rds 时,我仍在试图弄清楚为什么我的脚本失败了。但我从这个开始。

如果知识渊博的 SO 成员可以提供帮助,将不胜感激。谢谢!

编辑:

大家好,我碰巧找到了解决问题的方法 - 在下面发布了解决方案。如果它相当不优雅,我深表歉意。现在,我还有两个问题:

(1) 有没有更好的方法?

(2) 可以在 R 做些什么吗?和/或 data.table解决这个问题的代码?我的意思是,这个问题会导致不可预知的错误,并不是首先想到的事情。我的 2 美分。

最佳答案

可能,这与指针有关:

 attributes(aDT)
$names
[1] "a" "b"

$row.names
 [1]  1  2  3  4  5  6  7  8  9 10

$class
[1] "data.table" "data.frame"

$.internal.selfref
<pointer: 0x0000000000390788>

> attributes(bDT)
$names
[1] "a" "b"

$row.names
 [1]  1  2  3  4  5  6  7  8  9 10

$class
[1] "data.table" "data.frame"

$.internal.selfref
<pointer: (nil)>

> attributes(bDF)
$names
[1] "a" "b"

$row.names
 [1]  1  2  3  4  5  6  7  8  9 10

$class
[1] "data.frame"

> attributes(aDF)
$names
[1] "a" "b"

$row.names
 [1]  1  2  3  4  5  6  7  8  9 10

$class
[1] "data.frame"

您可以使用 .Internal(inspect(.)) 仔细查看正在发生的事情命令:
.Internal(inspect(aDT))

 .Internal(inspect(bDT))

关于R - readRDS() 和 load() 无法提供与原始数据相同的 data.tables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31250999/

相关文章:

r - dplyr 筛选具有大量匹配项的数据库表

macos - 从 Macbook 上的软件包安装程序安装软件包时 R 卡住

iphone - 完成的iPhone应用程序:添加新功能。录制系统声音然后可以播放

mysql - kernel limit "open file limit "和mysql "Opened_files"相关吗?

android - 在 sd 完成加载后设备启动时运行服务

javascript - 如何在浏览页面时保持音频播放?

r - 在 R 中可视化从一组对象到另一组对象的流程

r - 在 R 中使用带有 phylo 对象(无根树)的切割树

android - 从图库中选择图像并保存以备将来使用

java - 如何在扩展 ImageView 的类上保存状态?