Один и тот же пакет R в нескольких библиотеках - PullRequest
8 голосов
/ 09 января 2012

Что должно произойти, если пакет установлен в нескольких библиотеках? Например, в Debian / Ubuntu можно установить пакеты debianized через apt-get, а затем также установить более свежую версию того же пакета прямо из CRAN. При использовании library () будет загружен самый последний пакет или это зависит от порядка .libPaths ()?

Ответы [ 3 ]

5 голосов
/ 09 января 2012

Как уже отмечалось другими, .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 получит приоритет, в противном случае используется показанное здесь значение.

5 голосов
/ 09 января 2012

Насколько я понимаю, это будет зависеть от порядка .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 (если вы не установили для "verbose" значение 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 голосов
/ 09 января 2012

Если вы устанавливаете пакеты с помощью apt-get, вы будете пользователем sudo, поэтому библиотеки будут устанавливаться в общесистемном расположении (обычно /usr/lib/R).

При использовании CRAN вытакже может быть sudo или обычным пользователем.В первом случае пакеты будут устанавливаться в масштабе всей системы (перезапись файлов устанавливается с помощью apt-get);во втором случае пакеты будут установлены в $ HOME / R. пользователя *.

Если пакет существует в / usr / lib / R и $ HOME / R, первое расположение в .libPaths () будетиспользуется при загрузке (обычно это $ HOME / R).

EDIT: , как указал Дирк, общесистемные установки должны идти в / usr / local / lib / R /, а не/ USR / Библиотека / Р.Однако моя общая точка зрения такова: место установки зависит от прав пользователя, а порядок загрузки зависит от .libPaths ().

...