2015-10-13 79 views
5

我正在爲大型數據集構建分析工作流程,但首先必須在小型數據集上對其進行驗證。我想要做的是把他們在這樣的環境中分離我的「取樣」,從實際數據集的數據集:如何切換到新的環境並堅持下去?

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 
... 

但是當我這樣做,sample_df_1sample_df_2將存儲在全球環境而不是我的sample_data環境。當然,我可以使用assign(..., envir=sample_data),但這有點乏味,我不希望它們出現在最終的代碼中。

使用with也不理想,因爲它裏面的代碼行不能一個接一個執行,這使得它在開發階段相當不方便。

我希望達到的目標是同一種行爲作爲debugundebug,例如:

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) 

爲@Gregor指出,「設置選項」可能是更好的描述了我在尋找:允許用戶指定R REPL評估表達式的環境的選項。

謝謝!

+1

不知道我是否理解'with',你可以在那裏執行任何表達式,'with(sample_data,{a < - 1; b < - 2})' – jenesaisquoi

+1

沒錯,但是如果我有20個代碼塊我想開發,然後爲了調試它們,我必須寫(20)'(')並將每個代碼塊放在裏面,因爲'with'中的代碼只能作爲一個整體進行評估。當它準備就緒時,我必須將它們從'with'功能中複製出來。在我看來,使用我提出的方法會更快,更具可讀性。 – Benny

+0

問題是R中的環境只是不這樣工作。您無法爲分配指定不同的「默認」環境。 R是一種功能語言,通常使用功能來管理範圍/環境。所以你應該編寫一個需要一個環境的函數,並且可能在其中嵌入一個'with()'。 – MrFlick

回答

1

您可以按照這樣分配的變量新的環境:

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

然後,您可以通過任何連接的環境中訪問新的環境中這些變量,你擁有或使用sample_data$sample_df_1

是這樣你是什​​麼意思?

+0

我認爲OP希望能夠打開一個開關(或者設置一個選項),並且能夠在不輸入每個對象前面的'sample_data $'的情況下獲得這種行爲。 – Gregor

+0

你讓我@格雷戈爾。 – Benny

2

這不是你正在尋找的,但我認爲它是可行的(和安全的)。

每當你想在一個新的環境中發展,打開一個新文件和新的R會話(比方說,sample_data.R),source()創建您在父環境所需的任何對象,做你的發展是正常的腳本。

當你想從你真正全球環境一個特定的環境中訪問這些,你可以做到這一點(在你原來的R對話/環境)

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

它有一些缺點:經常很不方便來回切換,特別是如果您的代碼需要很長時間才能運行。但是,我真的很喜歡它讓你將不同參數的代碼分離到不同的文件中 - 如果你混淆了你在哪個環境和哪個環境中工作,這聽起來像是一個潛在的錯誤系統。分開文件通過強制執行代碼分離提供了一些保護。它還可以讓您的各種子環境輕鬆地從運行中省略 - 註釋掉主文件中的source()行將關閉整個子環境。

+0

謝謝@格雷戈。雖然不是我最初的意圖,但你的回答顯示了我可以用來改進我的工作流程的一些見解。 – Benny