如果一个包安装在多个库中会发生什么?例如,在 Debian/Ubuntu 中,可以通过 apt-get 安装 debianized 软件包,然后还可以直接从 CRAN 安装同一软件包的更新版本。使用 library() 时,会加载最新的包,还是取决于 .libPaths() 的顺序?
3 回答
我的理解是它取决于.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)
正如其他人已经说过的那样,.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
将获得优先权,否则使用此处显示的值。
如果您使用 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()。