我已经花了几个小时试图完成这项工作,并觉得我错过了一些简单的事情:
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"
Run Code Online (Sandbox Code Playgroud)
当我保存整个工作区时,保存函数然后加载回来(在我关闭/打开R Studio之后).但是在这里,save()和/或load()不起作用,加载后我的环境中只有一个字符串.
如何将单独的环境对象保存到文件中,而不是完整的工作区?然后我需要将该环境(my_env)中的所有对象加载到另一个会话中的.GlobalEnv中.
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>
Run Code Online (Sandbox Code Playgroud)
2) saveRDS/readRDS可以交替使用saveRDS和readRDS来保存和恢复单个对象。在这种情况下,readRDS返回对象本身而不是其名称,与load.
saveRDS(my_env, file = "MyEnv.RData")
rm(my_env)
my_env <- readRDS("MyEnv.RData")
my_env
## <environment: 0x000000000bfb45f8>
Run Code Online (Sandbox Code Playgroud)
3)save/attach另一种可能是MyEnv.RData放在搜索路径而不是全局环境中:
save(my_env, file = "MyEnv.RData")
rm(my_env)
attach("MyEnv.RData")
my_env
## <environment: 0x000000000b072188>
Run Code Online (Sandbox Code Playgroud)
注意:如果您希望将 的内容加载my_env到全局环境中而不是加载my_env自身,则必须将内容复制出来:
for(el in ls(my_env)) assign(el, get(el, my_env))
Run Code Online (Sandbox Code Playgroud)