8

我喜欢使用工作空间的想法。到目前为止,我总是保存整个工作区并将它们完全加载到现有项目中。但很多时候我只需要来自指定工作区的单个对象。是否有可能从另一个工作区单独加载它们。

此外,有时将对象添加到已经存在的工作区会很好。想象一下,例如,您有五个巨大的脚本,它们分别具有巨大的工作区,并且您不想将它们混合在一起以将它们全部放在一个工作区中。因此,现在您只想将五个工作空间中每一个的干净结果存储到另一个干净的工作空间......

所以这些是基本任务:

# save entire workspace
save.image("mypath/myworkspace")

# load entire workspace
load ("mypath/myworkspace")

# save a single object (or several)
save (myobject,file="mypath/myworkspace")

# load a single object from an existing workspace
?

# add a single object to an existing workspace
?
4

2 回答 2

14

RStudio 称您为globalenv()“工作区”

您可以将 .RData 文件加载到您的环境以外的环境中globalenv()

x <- 1; y <- 2 #First, create some objects
save.image()  # save workspace to disk
rm(list=ls()) # remove everything from workspace
tmp.env <- new.env() # create a temporary environment
load(".RData", envir=tmp.env) # load workspace into temporary environment
x <- get("x", pos=tmp.env) # get the objects you need into your globalenv()
#x <- tmp.env$x # equivalent to previous line
rm(tmp.env) # remove the temporary environment to free up memory

一旦一个对象在你的globalenv()中,它将显示在 RStudio 的“工作区”选项卡中。

同样,您可以将对象分配到环境中。

tmp.env <- new.env()
load(".RData", envir=tmp.env) # load workspace into temporary environment
assign("z", 10, pos=tmp.env)
#tmp.env$z <- 10 # equivalent to previous line

tmp.env现在,如果您知道save它们的位置,您可以保存所有对象。

save(list=ls(all.names=TRUE, pos=tmp.env), envir=tmp.env, file="test.RData")
rm(tmp.env)

您已经有效地将对象 , 添加z到存储在 test.RData 中的工作区。

rm(list=ls(all.names=TRUE))
load("test.RData")

> ls()
[1] "x"       "y"       "z"  
于 2013-03-18T21:42:35.337 回答
2

# load a single object from an existing workspace

您无法从工作区恢复一个对象。因为save.image(".Rdata")只是一个简化的命令save(list = ls(all=TRUE), file= ".RData")。当您使用load命令时,您可以从该列表中恢复所有对象。

但是,您可以保存合并到列表中的几个对象,然后加载它们。例如:

library(ggplot2)
c <- ggplot(mtcars, aes(factor(cyl)))
d<-c + geom_bar(width=.5)  # create two graphs 
c<- c + geom_bar()
save(list=c("c","d"),file="myobjects") # save them (notice that objects are accessed as strings)
rm(list = ls()) # remove from the memory
load(file="myobjects") # load again

你现在有你的对象(地块) c 和 d 回来了。这回答了你的最后一个问题。

现在,假设您已经有对象cd在文件中myobjects,并且您想向该文件添加更多对象。不加载它是不可能的,因为savesaveRDS存储压缩的数据(如果save你得到 tar 包并且saveRDS你可以选择压缩方法)。如您所知,如果不解包,您无法将数据添加到已归档的文件中。我看到的唯一解决方案是这个。假设我们要添加abmyobjects

library(ggplot2)
a<-qplot(rnorm(100))
b<-qplot(rnorm(200))
list=ls()
list<-list[-which(list%in%c("a","b"))] # list all variables except the one you want to save
rm(list=list) # we're deleting all except a and b
load(file="myobjects") # loading or unpacking objects c and d
save(list=ls(),file="myobjects") # saving objects a,b,c,d in myobjects file

这是一个粗略的解决方法,但是如果您考虑一下,在 R 中我们得到了数据或绘图对象(出于某种原因,我使用了 ggplot2 示例)。数据可以保存为save.table,图可以存储到 grobs 列表(包gridExtra),然后保存为save.

于 2013-03-15T14:42:01.790 回答