2010-12-10 77 views
18

%的[R編程風格的討論中,我看見有人曾經說過,他把所有的自定義函數到一個新的環境,將其固定。我還記得R環境可能被用作散列表。這是不錯的風格嗎?你什麼時候想把你的數據/功能放到一個新的環境中?或者只是使用.GlobalEnv什麼?當你想建立新的環境中的R

編輯把我的問題的第二部分回來: 如何檢查不同環境的同名變量?

回答

11

馬丁中號ä chler表明,這是一個您可能需要考慮attach(),儘管他建議在將.Rdata文件附加到搜索路徑的環境中,但您的Q本質上是相同的。

好處是,你不會混淆全球環境的功能,可能會意外覆蓋等。雖然我不會去這麼稱呼這種不好的風格,你可能會更好地堅持你的自定義功能進入你自己的個人R包。是的,這會導致設置包結構和提供一些文檔以允許安裝軟件包的一些開銷,但從長遠來看,這是一個更好的解決方案。有了像roxygen這樣的工具,這個過程變得更容易啓動。

就個人而言,我還沒有發現需要用10年以上,使用R的環境擺弄;有據可查的腳本來加載,處理和分析數據,並且自始至終清理完畢後都能很好地爲我服務。


另一項建議您的問題(現已刪除)的第二部分是使用with()(來自@約書亞的例子以下的):

> .myEnv <- new.env() 
> .myEnv$a <- 2 
> a <- 1 
> str(a) 
num 1 
> ls.str(.myEnv, a) 
a : num 2 
> str(.myEnv$a) 
num 2 
> with(.myEnv, a) 
[1] 2 
> a 
[1] 1 
+0

謝謝加文。上次你幫我解決R多部分公式問題。對於那個我對未註冊的用戶名使用「回答」作爲「評論」的問題感到抱歉。 – learnbasicR 2010-12-10 20:16:21

4

要回答你的第二個問題(你現在已經刪除),使用ls.str,或者只是$訪問環境中的物體:

.myEnv <- new.env() 
.myEnv$a <- 2 
a <- 1 
str(a) 
ls.str(.myEnv, a) 
str(.myEnv$a) 
+0

謝謝Joshua。這是我想知道的。我對提出基本問題和獲得RTFM答案感到羞愧,因此我刪除了該部分。 – learnbasicR 2010-12-10 20:08:09

6

如果您的數據和代碼的生態系統已經發展大足以讓你考慮在一個環境中隔離它,你最好創建一個包。一個包爲您提供了更多的支持:

  • ,其管理通過分離代碼和數據到文件,因此沒有那麼通過一次挖成長龐大而複雜的項目。

  • 一個軟件包使得它簡單易行,可以將您的工作交給其他人,以便他們可以使用您的代碼和數據。

  • 一個包提供文件和報告額外的支撐。

建立一個包R是那麼容易的,只需要調用package.skeleton(),每次我工作的項目得到它的代碼並保存在一個包數據。

我使用環境的唯一時間是當我需要隔離某些代碼的運行時,通常是由其他人編寫的腳本,以便它的副作用和變量名不會與我的交叉。我通過evalq(source('someScript.R', local=TRUE), SomeEnvironment)來做到這一點。

+0

爲什麼不使用'sys.source'而不是'evalq(...)'? – 2010-12-10 22:10:58

+0

不知道'sys.source'。乍一看,它沒有「局部」參數,它可能允許來自父環境的變量泄漏並影響源代碼的運行 - 這正是我想要避免的。 – Sharpie 2010-12-10 22:21:38