2012-01-08 37 views
8

如果包安裝在多個庫中會發生什麼?例如,在Debian/Ubuntu中,可以通過apt-get安裝debianized軟件包,然後直接從CRAN安裝更新版本的相同軟件包。當使用library()時,最近的包會被加載,還是取決於.libPaths()的順序?多個庫中的相同R包

回答

5

爲,.libPaths()搜索順序無論這就是爲什麼我們把它使得本地包搜索的第一個作爲發行版本,尤其是未被更新的Debian的穩定或Ubuntu的發行版中,更可能是老年人。

有該文件/etc/R/Renviron在這種效應的留言設定它:

# edd Apr 2003 Allow local install in /usr/local, also add a directory for 
#    Debian packaged CRAN packages, and finally the default dir 
# edd Jul 2007 Now use R_LIBS_SITE, not R_LIBS 
R_LIBS_SITE=${R_LIBS_SITE-'/usr/local/lib/R/site-library:/usr/lib/R/site-library:/usr/lib/R/library'} 

所以R_LIBS_SITE用戶設置的值會得到優先,否則會使用此處顯示的值。

+1

對於Debian特定的答案和對設計中使用的邏輯的描述+1。 – 2012-01-08 23:24:37

5

我的理解是,它將取決於.libPaths()的順序。這是library

if (!missing(package)) { 
     if (is.null(lib.loc)) 
      lib.loc <- .libPaths() 
     lib.loc <- lib.loc[file.info(lib.loc)$isdir %in% TRUE] 
    # >>>> snipped code 
     newpackage <- is.na(match(pkgname, search())) 
     if (newpackage) { 
      pkgpath <- find.package(package, lib.loc, quiet = TRUE, 
       verbose = verbose) 
      if (length(pkgpath) == 0L) { 
      # snipped 

碼這是從幫助頁面find.package

Details 

find.package returns path to the locations where the given packages are found. 
If lib.loc is NULL, then attached packages are searched before the libraries. 
If a package is found more than once, the first match is used. 

如果有多個實例,那麼就應該根據我的find.package的閱讀是一個警告代碼(除非你設置「詳細」爲FALSE):

if (length(paths) > 1L) { 
      paths <- paths[1L] 
      if (verbose) 
       warning(gettextf("package %s found more than once,\n 
           using the one found in %s", 
        sQuote(pkg), sQuote(paths)), domain = NA) 
0

如果使用安裝軟件包apt-get的,你會sudo的用戶,所以librari es將安裝在系統範圍內的位置(通常是/ usr/lib/R)。

當您使用CRAN時,您也可能是sudo或普通用戶。在第一種情況下,軟件包將安裝系統範圍(使用apt-get安裝的覆蓋文件);在第二種情況下,軟件包將安裝到用戶的$ HOME/R。

在/ usr/lib/R和$ HOME/R中都存在程序包的情況下,加載時通常會使用.libPaths()中的第一個位置(通常爲$ HOME/R)。

編輯:因爲德克指出,全系統的安裝應該去到/ usr/local/lib目錄/ R /,而不是/ usr/lib中/ R。但是,我的一般觀點是:安裝位置取決於用戶權限,加載順序取決於.libPaths()。已經被別人說

+1

這是不正確的,至少如果你使用預先製作的R或二進制文件用於Ubuntu或Debian_,我們設置了'R_LIBS'等,以便本地安裝總是進入'/ usr/local/lib/R /'。該計劃自2003年以來對成千上萬的用戶起作用。 – 2012-01-08 23:13:53

+0

那麼,如果我運行update.packages()會發生什麼?它會嘗試覆蓋'/ usr/lib/R'中的文件,還是會在'/ usr/local/lib/R'上安裝副本? – Jeroen 2012-01-09 04:12:55

+0

Dirk能否澄清一下:在我的系統中,我在/ usr/lib/R/site-library /和/ usr/local/lib/R/site-library /中看到了軟件包。例如,似乎r-cran-rjava已經安裝到/ usr/lib/R/site-library/rJava。 – neilfws 2012-01-09 22:37:18