8

如果一个包安装在多个库中会发生什么?例如,在 Debian/Ubuntu 中,可以通过 apt-get 安装 debianized 软件包,然后还可以直接从 CRAN 安装同一软件包的更新版本。使用 library() 时,会加载最新的包,还是取决于 .libPaths() 的顺序?

4

3 回答 3

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)
于 2012-01-08T22:02:27.077 回答
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将获得优先权,否则使用此处显示的值。

于 2012-01-08T23:15:14.757 回答
0

如果您使用 apt-get 安装软件包,您将成为 sudo 用户,因此库将安装在系统范围的位置(通常是 /usr/lib/R)。

当您使用 CRAN 时,您也可能是 sudo 或普通用户。在第一种情况下,软件包将在系统范围内安装(覆盖使用 apt-get 安装的文件);在第二种情况下,软件包将安装到用户的 $HOME/R。

如果包同时存在于 /usr/lib/R 和 $HOME/R 中,则 .libPaths() 中的第一个位置将在加载时使用(通常是 $HOME/R)。

编辑:正如 Dirk 指出的,系统范围的安装应该去 /usr/local/lib/R/,而不是 /usr/lib/R。但是,我的一般观点是:安装位置取决于用户权限,加载顺序取决于 .libPaths()。

于 2012-01-08T22:31:47.617 回答