2013-03-15 5 views
5

Mi piace l'idea di lavorare con gli spazi di lavoro. Finora ho sempre salvato interi spazi di lavoro e li ho caricati interamente su un progetto esistente. Ma molte volte ho bisogno solo di singoli oggetti da uno spazio di lavoro specificato. C'è la possibilità di caricarli separatamente da un altro spazio di lavoro.Carica e salva singoli oggetti in workspace in R/R-Studio

Inoltre, a volte sarebbe opportuno aggiungere un oggetto a un'area di lavoro già esistente. Immagina ad esempio di avere cinque script enormi con spazi di lavoro completamente diversi e di non doverli mescolare per averli tutti in un unico spazio di lavoro. Così ora si desidera memorizzare solo i risultati puliti da ciascuno dei cinque worspaces ad un altro spazio di lavoro pulito ...

Così tesi sono i compiti fondamentali:

# 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

Non è una risposta alla tua domanda (non riesci a pensare a una soluzione a questo), ma potresti prendere in considerazione l'organizzazione dei tuoi dati in elenchi anziché in spazi di lavoro. Quindi utilizzare attach (list) e staccare (elenco) in base alla necessità di oggetti da progetti/sottoprogetti differenti. Naturalmente, puoi sempre accedere a singoli oggetti da qualsiasi elenco in qualsiasi momento. – ndoogan

+0

'? SaveRDS' viene in mente. – Roland

+0

@ Roland. Ho provato il tuo suggerimento e penso che sia problematico con R-Studio. Ho ricevuto un messaggio di errore che è anche discusso qui: http://support.rstudio.org/help/discussions/problems/318-error-bad-restore-file-magic-number – Joschi

risposta

11

RStudio chiama il tuo globalenv() il vostro "spazio di lavoro"

è possibile caricare .rdata file in ambienti che non siano il 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 

volta che un oggetto è nella tua globalenv(), verrà visualizzato in RStudio del " Scheda "Area di lavoro".

Analogamente, è possibile assegnare oggetti all'ambiente.

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 

Ora, è possibile salvare tutti gli oggetti in tmp.env se dite save in cui si trovano.

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

Voi avete effettivamente aggiunto un oggetto, z, allo spazio di lavoro memorizzato in test.RData.

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

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

Bella soluzione e riproducibile sul mio pc. Grazie. – Joschi

1

# load a single object from an existing workspace

Non si può ripristinare un oggetto dallo spazio di lavoro. Dal save.image(".Rdata") è solo un comando semplificato per save(list = ls(all=TRUE), file= ".RData"). Quando si utilizza il comando load, si ripristinano tutti gli oggetti da tale elenco.

Tuttavia è possibile salvare gli oggetti coppia unificati in un elenco e quindi caricarli. Ad esempio:

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 

Ora i tuoi oggetti (diagrammi) c e d sono tornati. Questo risponde alla tua ultima domanda.

Ora, si supponga di avere già oggetti c e d nel file myobjects e si desideri aggiungere più oggetti a questo file. Senza caricarlo è impossibile, dal momento che save e saveRDS memorizza i dati compressi (nel caso di save si ottiene il pacchetto tar e in saveRDS si arriva a scegliere il metodo di compressione). Come sai, non puoi aggiungere dati a file già archiviati senza decomprimerlo. L'unica soluzione che vedo è questa. Supponiamo di voler aggiungere a e b a 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 

Si tratta di una soluzione di massima, se ci pensate, in R abbiamo ottenuto dati o oggetti di scena (io ho usato esempi ggplot2 per ragione). I dati possono essere salvati come save.table, i diagrammi possono essere archiviati nell'elenco delle fusioni (pacchetto gridExtra) e quindi salvati con save.

+1

Questo sembra essere ciò che il poster già conosce come fare (vedi il terzo esempio di salvataggio nel codice pubblicato). – ndoogan

+0

Considerando che non c'era codice con l'esempio di carico e la dimostrazione del caricamento degli oggetti, suppongo che il tuo argomento sia almeno altamente dubbio. Nuova aggiunta di oggetto da file questo è esattamente ciò che fa il codice, leggere attentamente. – user974514

+1

In realtà, ndoogan ha ragione. Voglio dire, posso anche salvare diversi oggetti come postato sotto la linea tre in questo modo: 'save (myobject1, myobject2, etc., File =" mypath/myworkspace ")'. in realtà non è necessario creare una lista prima di salvare gli oggetti insieme. La domanda precedente riguarda più l'aggiunta di un singolo oggetto a un'area di lavoro già esistente (senza perdere gli altri oggetti sovrascrivendola) o il ritorno di un singolo oggetto da un'area di lavoro esistente senza caricarlo completamente ... – Joschi

Problemi correlati