如何保存独立的 R 环境对象

Posted

技术标签:

【中文标题】如何保存独立的 R 环境对象【英文标题】:How to save a standalone R environment object 【发布时间】:2016-02-08 20:56:29 【问题描述】:

我已经花费了几个小时来尝试完成这项工作,但我觉得我缺少一些简单的东西:

my_env = new.env(hash = TRUE, parent = .GlobalEnv)
my_env[['echo']] <- function(x) x
my_env[['echo']](123)
[1] 123
my_env$echo(123)
[1] 123
save(my_env, file = "MyEnv.RData", envir = .GlobalEnv)
loaded_env <- load(file = "MyEnv.RData",envir = .GlobalEnv)
typeof(loaded_env)
[1] "character"

当我保存整个工作区时,函数会被保存然后加载回来(在我关闭/打开 R Studio 之后)。但是在这里,save() 和/或load() 不起作用,加载后我的环境中只有一个字符串。

如何将单独的环境对象保存到文件中,而不是完整的工作区?然后,我需要将该环境 (my_env) 中的所有对象加载到另一个会话中的 .GlobalEnv 中。

【问题讨论】:

【参考方案1】:

1) 保存/加载 您的代码确实可以恢复 my_env;但是,load 返回已恢复对象的名称,而不是对象本身。对象本身作为副作用而不是通过返回值被静默恢复。

save(my_env, file = "MyEnv.RData")
rm(my_env)
nms <- load("MyEnv.RData")
nms
## [1] "my_env"
my_env
## [1] <environment: 0x000000000bfa5c70>

2) saveRDS/readRDS 您可以交替使用saveRDSreadRDS 来保存和恢复单个对象。在这种情况下,readRDS 返回对象本身而不是其名称,这与 load 不同。

saveRDS(my_env, file = "MyEnv.RData")
rm(my_env)
my_env <- readRDS("MyEnv.RData")
my_env
## <environment: 0x000000000bfb45f8>

3) 保存/附加 另一种可能性是将MyEnv.RData 放在搜索路径上而不是全局环境中:

save(my_env, file = "MyEnv.RData")
rm(my_env)
attach("MyEnv.RData")
my_env
## <environment: 0x000000000b072188>

注意:如果您希望将my_env 的内容加载到全局环境中而不是加载my_env 本身,则必须将内容复制出来:

for(el in ls(my_env)) assign(el, get(el, my_env))

【讨论】:

谢谢! RDS 完美运行!如何将环境对象序列化为 char 向量?有一个serialize 函数 - 它返回的二进制格式是否与我从 RDS 读取文件一样? savesaveRDSserialize 都有一个 ascii 参数。 所以如果所有参数都相同,所有三个函数都返回二进制兼容格式? 酷!感谢您的帮助和对三个选项的详细解释。

以上是关于如何保存独立的 R 环境对象的主要内容,如果未能解决你的问题,请参考以下文章

以是不是存在为条件保存 R 对象

在 R markdown 中,如何防止非缓存块的图被单独保存?

如何使用UTF-8编码保存source()。R文件?

[R] 保存pheatmap图片对象到文件

菜鸟入门R语言独立t检验

试图将 R 环境中的所有内容保存到磁盘