在R / R-Studio中将单个对象加载并保存到工作区

时间:2013-03-15 13:00:46

标签: r

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

有时候,将对象添加到现有工作区会很不错。想象一下,例如,您有五个巨大的脚本,具有独立的巨大工作空间,您不希望将它们混合在一起,将它们全部放在一个工作空间中。所以现在你只想把五个劣质空间中每一个的干净结果存储到另一个干净的工作空间......

所以论文是基本任务:

# 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
?

2 个答案:

答案 0 :(得分:12)

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"  

答案 1 :(得分:1)

# 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回来了。这回答了你的最后一个问题

现在,假设您已在文件c中拥有对象dmyobjects,并且您希望向此文件添加更多对象。在不加载的情况下,这是不可能的,因为savesaveRDS存储了压缩的数据(如果save得到tar包,那么在saveRDS中你可以选择压缩方法)。如您所知,无法将数据添加到已存档的文件而无需解压缩。我看到的唯一解决方案就是这个。假设我们要将ab添加到myobjects

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,图表可以存储到grob列表(包gridExtra),然后保存为save