多个库中的相同R包

时间:2012-01-08 21:31:12

标签: r cran

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

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:5)

正如其他人已经说过的那样,.libPaths()搜索顺序问题就是为什么我们设置它以便首先搜索本地包作为发行版本,特别是Debian stable或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将优先,否则使用此处显示的值。

答案 2 :(得分: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()。