¿Forma indolora de instalar una nueva versión de R?

158

Andrew Gelman recientemente lamentó la falta de un proceso de actualización fácil para R (probablemente más relevante en Windows que Linux). ¿Alguien tiene un buen truco para hacer la actualización, desde instalar el software hasta copiar todos los ajustes / paquetes?

Esta sugerencia estaba contenida en los comentarios y es lo que he estado usando recientemente. Primero instale la nueva versión, luego ejecute esto en la versión anterior:

#--run in the old version of R
setwd("C:/Temp/")
packages <- installed.packages()[,"Package"]
save(packages, file="Rpackages")

Seguido de esto en la nueva versión:

#--run in the new version
setwd("C:/Temp/")
load("Rpackages")
for (p in setdiff(packages, installed.packages()[,"Package"]))
install.packages(p)
Shane
fuente
1
¿Qué tan actualizada es la solución que se ha utilizado aquí?
maj
Lo usé recientemente y funciona muy bien.
Litwos

Respuestas:

74

Solo para completar, hay algunas formas de evitar que tenga este problema. Como dijo Dirk, guarde sus paquetes en otro directorio en su computadora.

install.packages("thepackage",lib="/path/to/directory/with/libraries")

Puede cambiar el valor predeterminado .Libraryvalor utilizando la función .libPathsdemasiado

.libPaths("/path/to/directory/with/libraries")

Esto pondrá esta ruta como primer valor en la .Libraryvariable y la convertirá en la predeterminada.

Si desea automatizar esto aún más, puede especificarlo en el archivo Rprofile.site, que encontrará en el directorio / etc / de su compilación R. Luego se cargará automáticamente cada vez que se cargue R, y ya no tendrá que preocuparse por eso. Simplemente puede instalar y cargar paquetes desde el directorio especificado.

Finalmente, tengo un pequeño código incluido en mi Rprofile.site que me permite reinstalar todos los paquetes cuando instalo una nueva versión de R. Solo tiene que enumerarlos antes de actualizar a la nueva versión R. Lo hago usando un archivo .RData que contiene una lista actualizada con todos los paquetes.

library(utils)

## Check necessary packages
load("G:\Setinfo\R\packagelist.RData") # includes a vector "pkgs"
installed <- pkgs %in% installed.packages()[, 'Package']
if (length(pkgs[!installed]) >=1){
  install.packages(pkgs[!installed])
}

Hago el packagelist.RData especificando .Last()en mi Rprofile.site. Esto actualiza la lista de paquetes si instalé algunos:

.Last <- function(){
  pkgs <- installed.packages()[,1]
  if (length(pkgs) > length(installed)){
    save(pkgs,file="G:\Setinfo\R\packagelist.RData")
  }
}

Cuando instalo una nueva versión de R, solo agrego los elementos necesarios al archivo Rprofile.site y todos los paquetes se reinstalan. Tengo que ajustar el Rprofile.site de todos modos (usando contrastes de suma, agregando el código adicional para Tinn-R, estas cosas), por lo que no es realmente un trabajo extra. Solo lleva más tiempo instalar todos los paquetes nuevamente.

Este último bit es equivalente a lo que se da en la pregunta original como solución. Simplemente no necesito preocuparme por obtener primero la lista de "instalados".

Nuevamente, esto no funciona sin problemas si tiene paquetes que no están instalados desde CRAN. Pero este código es fácilmente extensible para incluir esos también.

Joris Meys
fuente
2
@Prasad: Thx. Sin embargo, la respuesta está un poco desactualizada, R 2.12 y guarda automáticamente los paquetes que instala usted mismo en algún lugar de una biblioteca estándar fuera del árbol R principal. Entonces, todo lo que tiene que hacer ahora es asegurarse de encontrar esa biblioteca y vincularla, si eso no sucedió por sí solo.
Joris Meys
@ 428790: ¿Dónde puedo encontrar esa biblioteca que mencionas?
Daniel Krizian
@DanielKrizian Mira el valor predeterminado en el objeto interno .Library. En mi caso, apunta de nuevo a la carpeta de instalación de R si no ha cambiado (lo que particularmente no me gusta, pero bueno)
Joris Meys
42

Esta es una vieja pregunta, por supuesto, pero podría haber una nueva respuesta fácil (que funciona solo para Windows), que acabo de encontrar.

install.packages("installr")
require(installr)
updateR()

La mejor manera de hacerlo es desde el sistema RGui. Todos sus paquetes se transferirán a la nueva carpeta y los antiguos se eliminarán o guardarán (puede elegir cualquiera de ellos). Luego, una vez que abre RStudio nuevamente, reconoce inmediatamente que está utilizando una versión actualizada. Para mí esto funcionó a las mil maravillas,

Más información sobre {installr} aquí .

Simón

SJDS
fuente
2
¿Qué pasa con los paquetes instalados a través de github?
skan
8
Cabe mencionar que esto es para Windows.
Beroe
27

Dos sugerencias rápidas:

  1. Utilice los archivos por lotes de Gabor, que se dice que comprenden herramientas que ayudan con, por ejemplo, esta reubicación masiva de bibliotecas. Advertencia: no los he usado.

  2. No instale bibliotecas dentro del 'filetree' de la versión R instalada. En Windows, puedo colocar R en la versión C: / opt / R / R- $ pero colocar todas las bibliotecas en C: / opt / R / library / usando el siguiente fragmento, ya que alivia el problema en primer lugar:

$ cat .Renviron         # this is using MSys/MinGW which looks like Cygwin  
## Example .Renviron on Windows    
R_LIBS="C:/opt/R/library"
Dirk Eddelbuettel
fuente
Me pregunto si transferir paquetes de, digamos, R 2.8 a R.9 causa algún problema. ¿O todo estará bien siempre que haga una actualización de paquetes en la nueva versión?
Eduardo Leoni
He estado haciendo esto durante bastante tiempo y no he tenido problemas. R es típicamente "compatible con versiones anteriores". Y IIRC solo una actualización (puede haber sido R 1.9 -> R 2.0) requirió una reconstrucción de todas las bibliotecas.
Dirk Eddelbuettel
55
También suelo copiar mi carpeta de Biblioteca en mi nueva instalación y ejecutar update.packages. Parece que funciona bien. Sin embargo, una carpeta de instalación opcional es mucho más elegante.
kpierce8
Solo para señalar: he agregado una respuesta con código R que realiza la sugerencia de Dirk (para usuarios de R windows)
Tal Galili
26

El método sugerido anteriormente no funcionará por completo si tiene paquetes que no son de CRAN. Por ejemplo, un paquete personal o un paquete descargado de un sitio que no es CRAN.

Mi método preferido en Windows (actualización 2.10.1 a 2.11.0):

  1. Instalar R-2.11.0
  2. Copiar R-2.10.0/library/*aR-2.11.0/library/
  3. Responda "no" a las preguntas que le preguntan si está bien sobrescribir.
  4. Inicie R 2.11.0
  5. Ejecute el comando R update.packages()
Kevin Wright
fuente
7

Con respecto a la solución dada en la pregunta, puede que no sea fácil ejecutar su versión anterior de R si ya ha instalado la nueva versión. En este caso, aún puede reinstalar todos los paquetes faltantes de la versión R anterior de la siguiente manera.

# Get names of packages in previous R version
old.packages <- list.files("/Library/Frameworks/R.framework/Versions/3.2/Resources/library")

# Install packages in the previous version. 

# For each package p in previous version...
    for (p in old.packages) {
      # ... Only if p is not already installed
      if (!(p %in% installed.packages()[,"Package"])) {
        # Install p 
        install.packages(p) 
      }
    }

(Tenga en cuenta que el argumento list.files()en la primera línea de código debería ser la ruta al directorio de la biblioteca para su versión R anterior, donde están todas las carpetas de paquetes en la versión anterior. En mi caso actual, esto es "/Library/Frameworks/R.framework/Versions/3.2/Resources/library". Esto será diferente si su versión R anterior no es 3.2, o si está en Windows)

La ifdeclaración asegura que un paquete no esté instalado si

  • Ya está instalado en la nueva versión R, o
  • Se ha instalado como una dependencia de un paquete instalado en una iteración anterior del forbucle.
Raffaele Vacca
fuente
Esto resolvió mi problema, ¡gracias! Esta pregunta puede sonar un poco tonta, pero ¿puedo eliminar bibliotecas antiguas?
m_c
4

Siguiendo la sugerencia de Dirk, aquí hay un código R para hacerlo en Windows: Cómo actualizar fácilmente R en Windows XP

Actualización (15.04.11): escribí otra publicación sobre el tema, explicando cómo lidiar con problemas comunes de actualización de R en Windows 7

Tal Galili
fuente
2
Para las versiones más recientes de R, Tal tiene un paquete llamado installrque automatiza este proceso (actualmente solo en Windows) r-statistics.com/tag/installr o github.com/talgalili/installr
Louis Maddox
1
Ejecutar Rgui.exe de C: \ Archivos de programa \ R \ R-3.6.0 \ bin \ i386 y escribir el código en la consola: install.packages(installr); library(installr); updateR(TRUE). Al final, [1] TRUEaparece. Por el excelente paquete de Galili, pasé de R 3.6.0 a R 3.6.1 muy fácilmente. Gracias tal.
Erdogan CEVHER
2

Dos opciones:

  1. Implementa mi respuesta aquí
  2. Si usa R en Eclipse con StatET, abra Ejecutar configuraciones , haga clic en la pestaña Consola y en el cuadro llamado Ejecución de fragmento de R después del inicio, agregue esta línea con su directorio elegido:.libPaths("C:/R/library")
Fred
fuente
1

Estoy en Windows 8 y por alguna extraña razón, nunca puedo instalar paquetes usando mis conexiones a Internet.

Generalmente lo instalo usando el archivo .zip de CRAN.

Después pasé de R 3.2.5 a R 3.3.1.

Simplemente copié los paquetes de

C:\Path\to\packa\R\win-library\3.2a C:\Path\to\packa\R\win-library\3.3.

Y luego reinicié la sesión R. Funcionó a la perfección. No he comprobado si TODOS los paquetes funcionan bien. Pero, los que revisé están funcionando perfectamente bien. Espero que este truco funcione para todos.

Salud.

Pragyaditya Das
fuente
1

La respuesta aceptada podría funcionar si tiene previsión, pero ya me había deshecho de la versión anterior, por lo que no pude seguir estas instrucciones. Los pasos descritos a continuación funcionaron para la actualización de OSX de 2.1 y 3.1.

ACTUALIZADO: Para obtener el directorio de su versión más reciente (en lugar de escribir 3.1 o 3.2) puede usar los siguientes comandos. El segundo uno convierte directamente a la R-variables, saltar .y ..y .DS_Store, el uso de:

OLD=$(ls -d /Library/Frameworks/R.framework/Versions/*.* |tail -n 2 | head -n 1)Resources/library/
echo "packages = c(\"`ls $OLD | tail +4| paste -s -d ',' - | sed -E 's|,|\",\"|'g`\")" | tr -d "/" 

(Agréguelo |pbcopyal final para copiarlo directamente en el portapapeles de su Mac)

Luego, dentro de R , puede pegar esa variable que se genera. Una vez que se define en la nueva versión de R, puede recorrer los paquetes instalados siguiendo las instrucciones anteriores ...

for (p in setdiff(packages, installed.packages()[,"Package"]))
   install.packages(p, dependencies=TRUE, quiet=TRUE, ask=FALSE)
beroe
fuente
0

para mí esta página es buena https://www.r-statistics.com/2013/03/updating-r-from-r-on-windows-using-the-installr-package/ u otra opción es simplemente instalar el nuevo opción y al final lo pones, por ejemplo en windows en mi pc

.libPaths (c ("D: /Documents/R/win-library/3.2", "C: / Archivos de programa / R / R-3.2.3 / library", "C: / Archivos de programa / R / R-3.2 .0 / library "," D: /Documents/R/win-library/2.15 ")

cada ruta de la última versión en mi caso siempre pongo la primera ruta es "D: /Documents/R/win-library/3.2" que es fija y luego pongo la otra porque no necesita copiar ni mover ningún paquete, en mi sugest solo llámalo

juanprimate
fuente
0

linux+ bash+ debian+ aptusuarios:

  1. Si está instalando / actualizando a la versión más reciente de R, entonces podemos suponer que tiene rootpermisos. (No es esencial, simplemente hace que el proceso sea mucho más simple; por coherencia, el siguiente script se usa sudopara todas las instalaciones). Como los Rpaquetes también se instalan root, por lo tanto, está permitido colocarlos /usr/local/.

  2. La llamada a curlcontinuación asume que ya está interesado en el sidlanzamiento de Rla última versión inestable (como se requiere al construir / verificar un Rpaquete), es decir

    cat /etc/apt/sources.list | grep 'sid' || exit 1

    aunque esto podría reemplazarse fácilmente con una versión estable reciente, por ejemplo buster.

  3. Nótese que estoy no usando una clave como es normalmente recomendada . Esto no es esencial, particularmente si (como en el script que sigue) instalamos paquetes dentro de R sí mismo (a Rscript -econtinuación). Además, tales teclas tienden a romperse / cambiar cada pocos años. Por lo tanto, puede agregar el siguiente prefacio al archivo R.shsiguiente:

    sudo apt-key adv --keyserver keyserver.ubuntu.com \ --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9

  4. El arrayde Rpaquetes claramente no es exhaustiva, pero da algunos ejemplos que personalmente encuentro útiles. Una nueva instalación / actualización con el debianpaquete r-recommended, como se muestra a continuación, debería proporcionar la última versión de todos los paquetes estándar 'recomendados' (por ejemplo survival). Creo que puede haber un ligero retraso entre una versión de CRAN y una actualización del debianpaquete correspondiente . Por lo tanto, es posible que desee agregar algunos de estos a arraycontinuación si Res esencial tener la última versión de un paquete 'recomendado' .

  5. Los debianpaquetes instalados en el proceso a continuación tampoco son esenciales (para usar r-base) ni exhaustivos, pero proporcionan un no. de 'complementos' que son importantes para un no razonable. de Rpaquetes

De todos modos ... coloque lo siguiente en R.sh:

sudo apt update && sudo apt --yes full-upgrade
sudo apt install --yes libappstream4 curl
### ov1 = online version; lv1 = local version (i.e. currently installed)
ov1=$(curl --silent --url https://packages.debian.org/sid/r-base |
    grep 'meta name=\"Keywords\"' |
    grep --only-matching '[0-9].*[0-9]') ; echo $ov1
## command -v = print a description of COMMAND similar to the `type' builtin
## && = if prior command succeeds, then do; || = if prior fails, then do
command -v 'R --version' &&
    lv1=$(R --version |
              grep --only-matching '[0-9\.]*[0-9]' |
              ## || = otherwise
              head -1) ||
        lv1=0
## 'lt' = less than
if dpkg --compare-versions "$lv1" 'lt' "$ov1" 
then ## declare -a = indexed array
     declare -a deb1=('r-base' 'r-base-dev' 'r-recommended')
     for i in "${deb1[@]}"
     do sudo apt install --yes "$i"
     done
fi
### certain Debian packages are required by 'R' so best have these first
sudo apt install --yes ccache libcairo2-dev libxml2-dev libcurl4-openssl-dev \
     libssl-dev liblapack-dev libssl-dev
declare -a pkg1=('data.table' 'ggplot2' 'knitr' 'devtools' 'roxygen2')
## installing as 'root' so these are installed in
Rscript -e ".libPaths()[1]"
for i in "${pkg1[@]}"
do sudo Rscript -e "install.packages('$i', dependencies=TRUE)"
done
### other useful additions
sudo apt install --yes libblas-dev libboost-dev libarmadillo-dev \
     jags pandoc pandoc-citeproc 
sudo apt update && sudo apt full-upgrade

Luego ejecutarlo, por ejemplo, suponiendo en el directorio ya: source R.sh.

Instalación de paquetes (si debiano R) uno por uno en un bucle de Shell es algo ineficaz, pero permite el rastreo más simple de errores, en mi humilde opinión. Puede tomar algo de tiempo dependiendo del no. de Rpaquetes, por lo que quizás sea más sencillo dejarlo correr durante la noche ...

Dardisco
fuente
1
No estoy seguro de por qué 'supervivencia' está en esa lista de paquetes complementarios. (Y es muy posible que esté engañando a este script bash.) Ha sido un paquete "recomendado" desde ... para siempre. Si no está instalando todos los paquetes recomendados con ese script, debe modificarse para hacerlo. También piense que el conjunto de paquetes r-base-devel sería necesario para cualquiera que use Linux. ¿Y por qué no agregar el PPA de Michael Rutter?
IRTFM
¡Gracias! Actualizado a la luz de sus útiles comentarios. De acuerdo, no es necesario instalar rutinariamente un paquete que ya está en r-recommended. 'r-base-devel' se conoce como r-base-dev( debianpaquete): ya estaba incluido. No soy reacio a usar una clave de seguridad (respuesta actualizada). La respuesta se mantiene alejada del uso de a PPA= Archivos de paquetes personales, ya que estos dependen necesariamente de una persona y, por lo tanto, son potencialmente falibles. Como dice el propio Michael Rutter (2012): "Si ha estado utilizando CRAN, entonces no hay razón para cambiar al PPA, ya que se proporcionan los mismos paquetes en ambas ubicaciones".
dardisco