2012-01-08 27 views
8

¿Qué se supone que debe suceder si un paquete está instalado en varias bibliotecas? Por ejemplo, en Debian/Ubuntu uno puede instalar paquetes debianizados a través de apt-get, y luego también instalar una versión más reciente del mismo paquete directamente desde CRAN. Al usar library(), ¿se cargará el paquete más reciente o depende del orden de .libPaths()?El mismo paquete R en varias bibliotecas

Respuesta

5

Como ya lo expresaron otros, .libPaths() es importante que los paquetes locales se busquen primero ya que las versiones de distro, especialmente con Debian estable o versiones de Ubuntu que no se actualizan, tienen más probabilidades de ser más antiguas .

hay un comentario a este efecto en el archivo de configuración de /etc/R/Renviron que:

# 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'} 

Así que un valor establecido por el usuario de R_LIBS_SITE obtendría precedencia, de lo contrario se utiliza el valor que se muestra aquí.

+1

+1 para la respuesta específica de Debian y la descripción de la lógica que usó en el diseño. –

5

Según tengo entendido, dependerá del orden de .libPaths(). Este es el código de 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 

Y esto es de la página de ayuda para 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. 

Y si hay más de un caso, entonces debe haber una advertencia sobre la base de mi lectura de la find.package código (a menos que establezca "detallado" que es falsa):

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

Si instala paquetes usando apt-get, que será el usuario sudo, por lo Librari es se instalará en la ubicación de todo el sistema (generalmente/usr/lib/R).

Cuando utiliza CRAN también puede ser sudo o un usuario normal. En el primer caso, los paquetes se instalarán en todo el sistema (sobreescribiendo archivos instalados usando apt-get); en el segundo caso, los paquetes se instalarán en $ HOME/R del usuario.

Donde existe un paquete en/usr/lib/R y $ HOME/R, la primera ubicación en .libPaths() se utilizará en la carga (que generalmente es $ HOME/R).

EDIT: como señaló Dirk, las instalaciones en todo el sistema deberían ir a/usr/local/lib/R /, no/usr/lib/R. Sin embargo, mi punto general es: la ubicación de la instalación depende de los permisos del usuario y el orden de carga depende de .libPaths().

+1

Eso no es correcto, al menos no _si usa los binarios R prefabricados para Ubuntu o Debian_ ya que configuramos 'R_LIBS' y otros para que las instalaciones locales siempre vayan a'/usr/local/lib/R/'. Ese esquema ha funcionado desde 2003 más o menos para miles de usuarios. –

+0

Entonces, ¿qué ocurre si ejecuto update.packages()? ¿Intentará sobrescribir los archivos dentro de '/ usr/lib/R', o instalará copias en'/usr/local/lib/R'? – Jeroen

+0

Dirk puede aclarar: en mi sistema, veo paquetes en/usr/lib/R/site-library/y/usr/local/lib/R/site-library /. Parece, por ejemplo, que r-cran-rjava se ha instalado en/usr/lib/R/site-library/rJava. – neilfws

Cuestiones relacionadas