2015-06-11 74 views
10

介紹:有什麼辦法可以在RStudio中禁用環境窗格?

我有一個RStudio項目,我正在研究(相當)大數據集。儘管我試圖保持全球環境的清潔,但過了一段時間後,它變得充滿了巨大的物體。

問題:

RStudio總是刷新環境窗格調試(可能是迭代的全球環境和每個對象上調用summary())之後,它發生在我的全球環境數十秒。儘管刷新本身是異步的,但R會話很忙,您必須等待它完成才能繼續工作。這使得調試非常煩人。並且我無法知道在RStudio中禁用「環境」窗格。

問:

有人能提出的任何美麗的解決方法嗎?我看到以下幾種可能性:

  1. 自定義RStudio來源以添加選項以禁用環境 窗格。
  2. 經常清潔的全球環境(不方便,因爲原始數據需要耗時的預處理,而且我經常更改預處理邏輯)。
  3. 也許有導致滯後的特定類型的對象不是因爲它們的大小,而是因爲它們的結構?

我正在研究可重現的示例,但尚不清楚哪些對象導致問題。

我前一段時間通過電子郵件發送了關於該問題的RStudio支持,但沒有得到任何答案。

+2

請你可以添加一些更多的細節來重現這一點。你如何進行調試?當你有幾個大對象(問題是內存,或者可能是讀對象),還是許多小對象(問題是獲取對象的結構)時,它會發生嗎?如果隱藏了環境窗格(即,您正在查看歷史記錄或生成窗格),它會有所幫助嗎? –

+0

我在任意代碼行設置RStudio中的斷點,啓動腳本/函數 - 在斷點處停止執行,然後按下「停止」或「繼續」按鈕,執行完成並「刷新」GIF出現在環境之上在此期間,沒有任何R命令工作和RSession.exe進程佔用100%(單核)CPU。因此,我不認爲它與記憶有關。我試圖崩潰環境窗格,沒有任何影響,我認爲它刷新無論如何。我的環境包含大約一百個對象,其中一些是大的xts,大的列表(大的列表),大的矩陣。 – cyberj0g

+0

在此處添加對禁用選項的支持:https://support.rstudio.com/hc/en-us/community/posts/212941327-Feature-request-Option-to-disable-environment-viewer – kennyB

回答

7

我可以重現與許多小嵌套列表變量的問題。

# Populate global environment with lots of nested list variables 
invisible(
    replicate(
    1000, 
    assign(
     paste0(sample(letters, 10, replace = TRUE), collapse = ""), 
     list(a = 1, b = list(ba = 2.1, bb = list(bba = 2.21, bbb = 2.22))), 
     envir = globalenv() 
    ) 
) 
) 

f <- function() browser() 

f() # hit ENTER in the console once you hit the browser 

這表明問題RStudio運行及其對全球環境相當於ls.str()

我懷疑該行爲是由ls("tools:rstudio", all.names = TRUE)列出的功能之一實現的,但我不確定哪個。如果你找到它,你可以覆蓋它。

或者,你最好的選擇是重做你的代碼,這樣你就不會在全球環境中分配如此多的變量。將大部分代碼包裝到函數中(因此大多數變量只在函數調用的整個生命週期中存在)。你也可以定義一個新的環境

e <- new.env(parent = globalenv()) 

然後分配裏面e所有結果。這樣刷新只需要幾微秒。

+2

偉大的代碼再現問題!注意,環境窗格大約7秒刷新(在我的i5 4670上),但是'ls'立即工作。我認爲這是RStudio的問題。是否有1000個列表可以真正被認爲是全球大環境?我深入研究了RStudio的源代碼,不,環境窗格不使用任何工具的功能:rstudio,它通過許多包裝器調用RSession內部的R'ls'的內部實現,然後迭代結果。所以我認爲答案是否定的,沒有改變RStudio代碼就無法禁用環境窗格。 – cyberj0g

+0

@ cyberj0g 1000個變量聽起來很多。就像我在答案中所說的那樣,如果你在函數中包裝代碼,那麼其中一些應該消失。而且你可能會更好地使用不同的數據結構。列表的列表的單一列表,也許。 –

相關問題