【问题标题】:How to save a standalone R environment object如何保存独立的 R 环境对象
【发布时间】:2023-04-02 05:42:01
【问题描述】:

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

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 中。

【问题讨论】:

    标签: r


    【解决方案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 参数。
    • 所以如果所有参数都相同,所有三个函数都返回二进制兼容格式?
    • 酷!感谢您的帮助和对三个选项的详细解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 2014-08-19
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    相关资源
    最近更新 更多