2015-10-13 7 views
5

Sto costruendo un flusso di lavoro di analisi per dataset di grandi dimensioni, ma prima devo convalidarlo su dataset di dimensioni più ridotte. Quello che mi piacerebbe fare è quello di separare i miei set di dati "campionati" dai set di dati effettivi mettendoli in un ambiente come questo:Come passare a un nuovo ambiente e attenervisi?

sample_data<-new.env() 
attach(sample_data) 
# downloading sample_data sets 
sample_df_1 <- some_download_function(parameters1) 
sample_df_2 <- some_download_function(parameters2) 
... 
# doing some stuff with them 
... 

Tuttavia quando faccio questo, sample_df_1 e sample_df_2 saranno conservati in ambiente globale piuttosto che il mio ambiente sample_data. Ovviamente posso usare assign(..., envir=sample_data) ma è un po 'noioso, e non voglio che vengano visualizzati nel codice finale.

Non è inoltre ideale utilizzare with poiché le righe di codice al suo interno non possono essere eseguite una per una, il che rende piuttosto scomodo lo sviluppo.

Quello che spero di raggiungere è lo stesso tipo di comportamento come debug e undebug, ad esempio:

switch_to_env(sample_data) 
# Everything done here will be done within environment "sample_data" 
# And the lines of codes here can be executed one by one 
switch_to_env(.GlobalEnv) 

come @Gregor sottolineato, "l'impostazione delle opzioni" probabilmente meglio descrive quello che sto cercando : un'opzione che consente all'utente di specificare l'ambiente in cui R REPL valuta le espressioni.

Grazie!

+1

non capisco bene di 'with', puoi eseguire qualsiasi espressione in là,' con (sample_data, {a <- 1; b <- 2}) ' – jenesaisquoi

+1

Esatto, ma se ho 20 blocchi di codici Mi piacerebbe svilupparmi, quindi per debuggarli devo scrivere 20 'con()' e inserire ogni pezzo di codice al suo interno perché il codice all'interno di 'with' può essere valutato solo come un tutto. E quando è pronto dovrò copiarli dalla funzione 'with'.A mio parere sarebbe molto più veloce e più leggibile usare il mio approccio suggerito. – Benny

+0

Il problema è che gli ambienti in R semplicemente non funzionano così. Non è possibile assegnare diversi ambienti "predefiniti" per l'assegnazione. R è un linguaggio funzionale e normalmente si usano le funzioni per gestire ambito/ambienti. Quindi dovresti scrivere una funzione che richiede un ambiente e magari annidare un 'with()'. – MrFlick

risposta

1

È possibile assegnare le variabili al nuovo ambiente come così:

sample_data<-new.env() 
sample_data$sample_df_1 <- some_download_function(parameters1) 
sample_data$sample_df_2 <- some_download_function(parameters2) 

si può quindi accedere a queste variabili all'interno del nuovo ambiente da una allegando l'ambiente come si deve o utilizzare sample_data$sample_df_1

È che Cosa vuoi dire?

+0

Penso che l'OP spera di colpire un interruttore (o impostare un'opzione) ed essere in grado di ottenere questo comportamento senza digitare 'sample_data $' davanti a ogni oggetto. – Gregor

+0

Mi prendi @Gregor. – Benny

2

Questo non è esattamente quello che stai cercando, ma penso che sia fattibile (e sicuro).

Ogni volta che si desidera sviluppare in un nuovo ambiente, aprire un nuovo file e una nuova sessione R, (ad esempio, sample_data.R), source() uno script che crea gli oggetti desiderati nell'ambiente padre e fare lo sviluppo normalmente.

Quando si desidera accedere a questi all'interno di un ambiente specifico dal tuo vero ambiente globale si può fare questo (nella sessione R/ambiente originale)

sample_data<-new.env() 
source("sample_data.R", local = sample_data) 

ha alcuni svantaggi: molto scomodo per frequenti commutazione avanti e indietro, soprattutto se il codice richiede molto tempo per essere eseguito. Tuttavia, in realtà mi piace che ti faccia separare il codice per diversi argomenti in file diversi - questo suona come un sistema potenzialmente buggy se ti viene confusa cosa è dove e in quale ambiente stai lavorando. La presenza di file separati offre una certa protezione applicando la separazione dei codici. Rende anche i tuoi vari sotto-ambienti facili da omettere da una corsa --- commentando la riga source() nel tuo file principale si spegne l'intero sottoambiente.

+0

Grazie a @Gregor. Sebbene non sia quello che inizialmente intendevo, la tua risposta ha mostrato alcuni spunti su cui posso lavorare per perfezionare il mio flusso di lavoro. – Benny

Problemi correlati