【问题标题】:Why object becomes different after save/load to/from RData?为什么对象在保存/加载到/从 RData 后变得不同?
【发布时间】:2013-03-19 05:28:43
【问题描述】:

我有一个名为 eset 的大型 ExpressionSet 对象 (Bioconductor)。你能解释为什么会这样吗?为什么保存/加载后对象的副本与原始副本不同?

> e2=eset
> identical(e2,eset)
[1] TRUE
> save(e2,file="test.RData")
> rm(e2)
> e2 # just to check the removal
Error: object 'e2' not found
> load("test.RData")
> identical(e2,eset)
[1] FALSE

还有其他方法可以检查两个对象的身份吗?

如果需要,我正在 Windows 7 下使用 R 2.15.1。

【问题讨论】:

  • 只是猜测,也许这种数据类型部分存储在磁盘上?
  • 较小的物体会发生这种情况吗?
  • 试试all.equal,而不是相同的——这会告诉你对象有什么不同。
  • 可能有附加类?
  • @Ista:是的,all.equal 返回 TRUE。

标签: r object load save rdata


【解决方案1】:

环境是少数 R 对象类型之一(连接是另一种),其保存和加载并不完全相反。

e <- new.env()
f <- e
identical(e,f)
# [1] TRUE
save("f", file="f.Rdata")
rm(f)
load("f.Rdata")
identical(e,f)
# [1] FALSE

ExpressionSet 对象包含一个assayData 槽,属于AssayData 类,它被描述为“定义为listenvironment 的类联合的容器类”。虽然我的电脑上没有安装 eset,但我猜想esete2assayData 插槽引用了不同的环境,导致identical(eset, e2) 返回@ 987654333@.

【讨论】:

  • 是的,你可能是对的。 identical(assayData(e2),assayData(eset)) 返回 FALSE,但 all.equal(assayData(e2),assayData(eset)) 返回 TRUE。
  • 可以肯定地说,您可以通过执行(例如)str(e2)str(e2@assayData) 等“向下钻取”对象,直到您可以找到并检查存储在其中的环境那里。祝你好运!
  • 是的,assayData 指的是两个对象的不同环境。看起来这是唯一的区别。我在开发 3.0 版本中看到相同的功能会有ignore.environment 参数。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 2022-06-15
  • 2014-04-11
相关资源
最近更新 更多