2016-02-08 16 views
5

sto spendendo già ore a cercare di fare questo lavoro e sento che mi manca qualcosa di semplice:Come salvare un ambiente autonomo R oggetto

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" 

Quando li risparmio intera area di lavoro, le funzioni vengono salvate e poi caricato indietro (dopo aver chiuso/aperto R Studio). Ma qui, save() e/o load() non funzionano, e ho solo una stringa nel mio ambiente dopo il caricamento.

Come è possibile salvare un oggetto di ambiente separato in un file, non uno spazio di lavoro completo? Quindi ho bisogno che tutti gli oggetti all'interno di quell'ambiente (my_env) vengano caricati in .GlobalEnv in un'altra sessione.

risposta

4

1) salvare/caricare Il codice funziona in quanto my_env viene ripristinato; tuttavia, load restituisce i nomi degli oggetti ripristinati, non gli oggetti stessi. Gli oggetti stessi vengono ripristinati automaticamente come un effetto collaterale piuttosto che tramite il valore restituito.

save(my_env, file = "MyEnv.RData") 
rm(my_env) 
nms <- load("MyEnv.RData") 
nms 
## [1] "my_env" 
my_env 
## [1] <environment: 0x000000000bfa5c70> 

2) saveRDS/readRDS È possibile utilizzare alternativamente saveRDS e readRDS per salvare e ripristinare singoli oggetti. In tal caso, readRDS restituisce l'oggetto stesso anziché il suo nome a differenza di load.

saveRDS(my_env, file = "MyEnv.RData") 
rm(my_env) 
my_env <- readRDS("MyEnv.RData") 
my_env 
## <environment: 0x000000000bfb45f8> 

3) salvare/attach Un'altra possibilità è quella di posizionare MyEnv.RData nel percorso di ricerca, piuttosto che nel contesto globale:

save(my_env, file = "MyEnv.RData") 
rm(my_env) 
attach("MyEnv.RData") 
my_env 
## <environment: 0x000000000b072188> 

Nota: Se si desidera caricare il contenuto del my_env nell'ambiente globale invece di caricare my_env stesso, sarà necessario copiare i contenuti fuori:

for(el in ls(my_env)) assign(el, get(el, my_env)) 
+0

Grazie! RDS funziona perfettamente! Come posso serializzare un oggetto ambiente in un vettore char? Esiste una funzione 'serialize' - restituisce lo stesso formato binario come se dovessi leggere un file da RDS? –

+0

'save',' saveRDS' e 'serialize' hanno tutti un argomento' ascii'. –

+0

quindi se tutti gli argomenti sono gli stessi, tutte e tre le funzioni restituiscono i formati compatibili binari? –