2011-11-03 83 views
21

在升級到R-2.14之前,我想借此機會合理化已安裝軟件包的文件夾結構。如何在R中管理多個包位置(文件夾)?

目前我使用R默認值,即所有新安裝的軟件包都轉到R_LIBS_USER。不過,我真正區分兩類包:

  • 包我反覆使用我的工作,例如, plyrdata.table
  • 軟件包只安裝與試驗(通常複製的問題和答案在計算器上)

由於install.packages提供一個指定lib參數的選項,這顯然是可能的。

是否有一種管理包裹位置的簡單方法,例如通過在.RProfileRProfile.Site中創建一些合理的設置/包裝功能?

+1

這裏是[一個相關的和有用的問答](http://stackoverflow.com/questions/2988559/how-do-you-use-multiple-versions-of-the-same-r-package)。 – Iterator

回答

24

有很多選擇。我做的第一件事是修改我的Rprofile.site以包含以下行,使我的默認庫路徑成爲我的R安裝中不包括的目錄。

.libPaths(c("D:/R/Library",.libPaths())) 

這使得D:/R/Library我的默認路徑不會丟失其他路徑。您可以添加兩條路徑,如D:/R/Library/WorkD:/R/Library/Test。如果您在install.packages()中未指定lib,則放在第一個位置的是默認值。

然後,您可以在.Rprofile.site中分配兩個變量。這些被分配在基本的命名空間中,因此總是可以訪問的,並且不會被ls()移除。像

.libwork <- 'D:/R/Library/Work' 
.libtest <- 'D:/R/Library/Test' 

的東西,它允許你安裝軟件包,如:

install.packages('aPackage',lib=.libwork) 

還有其他的選擇太我猜,但是這是我會怎麼滾。

+0

+1大提示,Joris。 –

+3

使用這種方法時會發出警告:當嘗試使用'R CMD檢查...'檢查/構建/安裝軟件包時,會導致複雜情況。原因在於'R CMD check'和'R CMD build'不會讀取'.Rprofile'(http://cran.r-project.org/doc/manuals/R-exts.html#Checking-and-建築包)。 – Andrie

4

您應該能夠通過環境變量R_LIBS中冒號分隔的路徑列表指定幾個庫路徑/樹。我無法在R 2.13.1打補丁的時候可靠地工作 - 它只能使用第一個條目。我得到R_LIBSR_LIBS_USER在我的系統上可靠地工作 - 我通常只設置前者。

.libPaths()可以爲搜索到的庫樹集添加新路徑。我只需在我的.Rprofile中添加適當的電話.libPaths(new)即可爲每個會話添加相關的樹。然後,您可以選擇在安裝時安裝軟件包的位置 - 即使用哪個樹。

+0

這裏的經驗相同。這就是爲什麼我使用.libPaths()來設置這些。另外,因爲install.packages()將.libPaths()的第一個值作爲默認值。我發現比擺弄環境變量更容易。 –

2

要回答,我必須給出一些背景。

出於可重現性的目的,我嘗試編寫腳本,包括我的整個R設置。我有一個腳本「initializeR.r」,其中包括安裝軟件包,並且我已經安裝了軟件包,比如與緩存有關的軟件包,與可視化,採樣,空間統計等相關的軟件包 - 我自己的小軟件任務視圖,如果你願意的話。

舉例來說,這裏是一個片段:

# Profiling & testing 
Packages$CodingTools = c("codetools","debug", "profr","proftools","RUnit") 

我結合一些束變成了「大」包(或主要)列表和其他人進入「輔助」列表中。我一定要在主列表上安裝所有東西 - 這些都需要有一個合理的R環境,使用我自己的腳本,函數和包等。(順便說一下,一些包被分配到多個包,但只有少數;我在處理彙總列表之前進行了重複處理。)

然後,我指定一個特定於平臺的默認庫,然後安裝到那裏。然而,這種能力是可擴展的,並且這個想法可以擴展到包括每個包捆綁包(或包)的可選位置:只從包名稱映射,例如, 「CodingTools」轉換爲唯一的目錄(庫路徑),例如「D:/ R/Library/CodingTools」。這可以在初始化腳本中完成,默認選項爲匹配列表&,或者位置可以存儲在別處,例如散列表,JSON或數據庫。

正如其他人所說的,默認庫路徑需要傳遞給R.這可以在.RProfile.site中完成。在我的情況下,我有另一個腳本用於根據需要初始化R實例。我嘗試避免由R讀取的外部參數文件(例如.Rprofile),而是通過函數調用在我自己的包中進行所有初始化(儘管參數仍然是外部的)。這往往會使我更容易調試和重現我的工作。所以,我的庫路徑可以包含在指定數據文件位置的同一種JSON中。

個人而言,我想遠離定義腳本內的包,而是使用JSON,因爲我可以更輕鬆地爲不同的安裝配置創建不同的JSON文件。我已經爲了大多數其他重複性工作目的而做到這一點。

相關問題