2013-03-15 9 views
5

ich spare mag die Idee, mit Arbeitsbereichen zu arbeiten. Bisher habe ich immer ganze Arbeitsbereiche gespeichert und diese komplett in ein bestehendes Projekt geladen. Aber oft brauche ich nur einzelne Objekte aus einem bestimmten Arbeitsbereich. Gibt es eine Möglichkeit, sie separat von einem anderen Arbeitsbereich zu laden.Laden und einzelne Objekte zu Arbeitsbereichen in R/R-Studio

auch manchmal wäre es schön, ein Objekt zu einem bereits vorhandenen Arbeitsbereich hinzuzufügen. Stellen Sie sich zum Beispiel vor, Sie haben fünf riesige Skripte mit sehr großen Arbeitsbereichen, und Sie möchten sie nicht miteinander kombinieren, um alle in einem Arbeitsbereich zu haben. So, jetzt wollen Sie nur die saubere Ergebnisse aus jeder der fünf worspaces zu einem anderen sauberen Arbeitsplatz speichern ...

So Thesen die grundlegenden Aufgaben sind:

# 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

Keine Antwort auf Ihre Frage (ich kann mir keine Lösung vorstellen), aber Sie könnten Ihre Daten lieber in Listen als in Arbeitsbereichen organisieren. Verwenden Sie dann attach (list) und detach (list), wenn Sie Objekte aus unterschiedlichen Projekten/Teilprojekten benötigen. Natürlich können Sie jederzeit aus einer beliebigen Liste auf einzelne Objekte zugreifen. – ndoogan

+0

'' saveRDS' kommt in den Sinn. – Roland

+0

@ Roland. Ich habe deinen Tipp ausprobiert und ich denke, es ist problematisch mit R-Studio. Ich habe eine Fehlermeldung erhalten, die auch hier diskutiert wird: http://support.rstudio.org/help/discussions/problems/318-error-bad-restore-file-magic-number – Joschi

Antwort

11

RStudio ruft Ihr globalenv() Ihr "Arbeitsplatz"

können Sie laden .rdata Dateien in anderen Umgebungen als Ihr 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 

Sobald ein Objekt in Ihrem globalenv() ist, wird es in RStudio die auftauchen " Arbeitsbereich "Registerkarte.

Ebenso können Sie Objekte in die Umgebung zuweisen.

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 

Jetzt können Sie alle Objekte in tmp.env sparen, wenn Sie save sagen, wo sie sich befinden.

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

Sie haben hinzugefügt effektiv ein Objekt, z, auf den in test.RData gespeicherten Arbeitsbereich.

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

> ls() 
[1] "x"  "y"  "z" 
+0

Schöne Lösung und reproduzierbar auf meinem PC. Vielen Dank. – Joschi

1

# load a single object from an existing workspace

Sie können nicht ein Objekt aus dem Arbeitsbereich wiederherstellen. Seit save.image(".Rdata") ist nur ein vereinfachter Befehl für save(list = ls(all=TRUE), file= ".RData"). Wenn Sie den Befehl load verwenden, stellen Sie alle Objekte aus dieser Liste wieder her.

immer Sie fusionierte paar Objekte in einer Liste speichern und laden sie dann. Zum Beispiel:

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 

Sie haben jetzt Ihre Objekte (Plots) c und d zurück. Das beantwortet deine letzte Frage.

Angenommen, Sie haben bereits die Objekte c und d in der Datei myobjects, und Sie möchten dieser Datei weitere Objekte hinzufügen. Ohne es zu laden ist es unmöglich, da save und saveRDS speichert Daten komprimiert (bei save Sie TAR-Paket erhalten und in saveRDS erhalten Sie Komprimierungsverfahren zur Auswahl). Wie Sie wissen, können Sie Daten zu bereits archivierten Dateien nicht hinzufügen, ohne sie zu entpacken. Die einzige Lösung, die ich sehe, ist diese. Angenommen, wir möchten a und b zu myobjects hinzufügen.

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 

Dies ist eine grobe Abhilfe, aber wenn man darüber nachdenkt, in R wir haben entweder Daten oder Grundstück Objekte (i ggplot2 Beispiele für Grund verwendet). Die Daten können als save.table gespeichert werden, können Plots zur Liste Grobs gespeichert werden (Paket gridExtra) und dann gespeichert mit save.

+1

Das scheint zu sein, was das Plakat bereits kennt wie es geht (siehe das dritte Sicherungsbeispiel im geposteten Code). – ndoogan

+0

Wenn man bedenkt, dass es keinen Code mit dem Ladebeispiel und dem Laden von Objekten gab, nehme ich an, dass Ihr Argument zumindest höchst zweifelhaft ist. Neues Objekt hinzufügen aus Datei Dies ist genau was Code tut, sorgfältig lesen. – user974514

+1

Eigentlich hat ndoogan recht. Ich meine, ich kann auch mehrere Objekte speichern, die wie in Zeile drei wie folgt gepostet werden: 'save (myobject1, myobject2 usw., File =" mypath/myworkspace ")'. Es ist nicht wirklich notwendig, eine Liste zu erstellen, bevor die Objekte zusammen gespeichert werden. Die obige Frage bezieht sich mehr auf das Hinzufügen eines einzelnen Objekts zu einem bereits vorhandenen Arbeitsbereich (ohne die anderen Objekte durch Überschreiben zu verlieren) oder das Wiederherstellen eines einzelnen Objekts aus einem vorhandenen Arbeitsbereich, ohne es vollständig zu laden ... – Joschi

Verwandte Themen