Modo indolore per installare una nuova versione di R?


158

Andrew Gelman ha recentemente lamentato la mancanza di un semplice processo di aggiornamento per R (probabilmente più rilevante su Windows rispetto a Linux). Qualcuno ha un buon trucco per eseguire l'aggiornamento, dall'installazione del software alla copia di tutte le impostazioni / pacchetti?

Questo suggerimento era contenuto nei commenti ed è quello che ho usato di recente. Innanzitutto installa la nuova versione, quindi esegui questa versione nella vecchia versione:

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

Seguito da questo nella nuova versione:

#--run in the new version
setwd("C:/Temp/")
load("Rpackages")
for (p in setdiff(packages, installed.packages()[,"Package"]))
install.packages(p)

1
Quanto è aggiornata la soluzione che è stata utilizzata qui?
maj

L'ho usato di recente e funziona benissimo.
Litwos,

Risposte:


74

Solo per completezza, ci sono alcuni modi per impedirti di avere questo problema. Come ha detto Dirk, salva i tuoi pacchetti in un'altra directory sul tuo computer.

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

È possibile modificare il valore predefinito .Libraryvalore utilizzando la funzione di .libPathstroppo

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

Questo metterà questo percorso come primo valore nella .Libraryvariabile e lo renderà predefinito.

Se vuoi automatizzarlo ulteriormente, puoi specificarlo nel file Rprofile.site, che trovi nella directory / etc / della tua build R. Quindi si caricherà automaticamente ogni volta che si carica R, e non dovrai più preoccupartene. Puoi semplicemente installare e caricare i pacchetti dalla directory specificata.

Infine, ho incluso un piccolo codice nel mio Rprofile.site che mi consente di reinstallare tutti i pacchetti quando installo una nuova versione R. Devi solo elencarli prima di aggiornare alla nuova versione R. Lo faccio usando un file .RData contenente un elenco aggiornato con tutti i pacchetti.

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])
}

Faccio il .Last()packagelist.RData specificando nel mio Rprofile.site. Questo aggiorna l'elenco dei pacchetti se ne ho installati alcuni:

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

Quando installo una nuova versione R, aggiungo solo gli elementi necessari al file Rprofile.site e tutti i pacchetti vengono reinstallati. Devo comunque adattare Rprofile.site (usando i contrasti di somma, aggiungendo il codice extra per Tinn-R, queste cose), quindi non è davvero un lavoro extra. Ci vuole solo del tempo extra per installare tutti i pacchetti di nuovo.

Quest'ultimo bit equivale a ciò che viene fornito nella domanda originale come soluzione. Non devo preoccuparmi di ottenere prima l'elenco "installato".

Ancora una volta, questo non funziona perfettamente se hai pacchetti che non sono installati da CRAN. Ma questo codice è facilmente estendibile per includere anche quelli.


2
@Prasad: Thx. La risposta è un po 'datata, R 2.12 e salva automaticamente i pacchetti installati da qualche parte in una libreria standard all'esterno dell'albero principale R. Quindi tutto ciò che devi fare ora è assicurarti di trovare quella libreria e collegarti ad essa, se ciò non è accaduto da solo.
Joris Meys,

@ 428790: Dove posso trovare quella biblioteca che menzioni?
Daniel Krizian,

@DanielKrizian Guarda il valore predefinito nell'oggetto interno .Library. Nel mio caso, fa riferimento alla cartella di installazione R se invariata (che non mi piace particolarmente, ma bene)
Joris Meys,

42

Questa è una vecchia domanda ovviamente, ma potrebbe esserci una nuova risposta semplice (che funziona solo per Windows), che ho appena trovato.

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

Il modo migliore per farlo è dal sistema RGui. Tutti i tuoi pacchetti verranno trasferiti nella nuova cartella e quelli vecchi verranno eliminati o salvati (puoi sceglierne uno). Quindi, una volta aperto nuovamente RStudio, riconosce immediatamente che si sta utilizzando una versione aggiornata. Per me questo ha funzionato come un incantesimo,

Maggiori informazioni su {installr} qui .

Simon


2
Che dire dei pacchetti installati tramite github?
skan

8
Va detto che questo è per Windows.
Beroe,

27

Due suggerimenti rapidi:

  1. Usa i file batch di Gabor che si dice comprendano strumenti che aiutano, ad esempio, a trasferire queste librerie di massa. Avvertenza: non li ho usati.

  2. Non installare librerie all'interno del 'filetree' della versione R installata. Su Windows, posso mettere R in C: / opt / R / R- $ versione ma posizionare tutte le librerie in C: / opt / R / library / usando il seguente frammento in quanto allevia il problema in primo luogo:

$ cat .Renviron         # this is using MSys/MinGW which looks like Cygwin  
## Example .Renviron on Windows    
R_LIBS="C:/opt/R/library"

Mi chiedo se il trasferimento di pacchetti, ad esempio, da R 2.8 a R.9 causi problemi? O andrà tutto bene finché eseguirai un update.packages nella nuova versione?
Eduardo Leoni,

Lo sto facendo da un po 'di tempo e non ho avuto problemi. R è in genere "compatibile con il futuro". E IIRC solo un aggiornamento (potrebbe essere stato R 1.9 -> R 2.0) ha richiesto una ricostruzione di tutte le librerie.
Dirk Eddelbuettel,

5
Di solito copio anche la mia cartella Library nella mia nuova installazione ed eseguo update.packages. Sembra che funzioni bene. Una cartella di installazione opzionale è tuttavia molto più elegante.
kpierce8,

Solo per sottolineare - ho aggiunto una risposta con il codice R eseguendo il suggerimento di Dirk (per utenti R windows)
Tal Galili

26

Il metodo suggerito sopra non funzionerà completamente se si hanno pacchetti che non provengono da CRAN. Ad esempio, un pacchetto personale o un pacchetto scaricato da un sito non CRAN.

Il mio metodo preferito su Windows (aggiornamento da 2.10.1 a 2.11.0):

  1. Installa R-2.11.0
  2. Copia R-2.10.0/library/*inR-2.11.0/library/
  3. Rispondi "no" alle istruzioni che ti chiedono se è possibile sovrascrivere.
  4. Avviare R 2.11.0
  5. Esegui il comando R. update.packages()

7

Rispetto alla soluzione fornita nella domanda, potrebbe non essere facile eseguire la versione precedente di R se è già stata installata la nuova versione. In questo caso, è ancora possibile reinstallare tutti i pacchetti mancanti dalla versione R precedente come segue.

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

(Nota che l'argomento list.files()nella prima riga di codice dovrebbe essere il percorso della directory della libreria per la tua precedente versione R, dove sono tutte le cartelle dei pacchetti nella versione precedente. Nel mio caso attuale, questo è "/Library/Frameworks/R.framework/Versions/3.2/Resources/library"diverso. la tua versione R precedente non è 3.2 o se sei su Windows.)

La ifdichiarazione si assicura che un pacchetto non sia installato se

  • È già installato nella nuova versione R o
  • È stato installato come dipendenza da un pacchetto installato in una precedente iterazione del forciclo.

Questo ha risolto il mio problema, grazie! Questa domanda potrebbe sembrare un po 'stupida, ma posso eliminare le vecchie librerie?
m_c,

4

Seguendo il suggerimento di Dirk, ecco un codice R per farlo su Windows: come aggiornare facilmente R su Windows XP

Aggiornamento (15.04.11): ho scritto un altro post sull'argomento, spiegando come affrontare i problemi comuni dell'aggiornamento di R su Windows 7


2
Per le versioni più recenti di R, Tal ha un pacchetto chiamato installrche automatizza questo processo (attualmente solo su Windows) r-statistics.com/tag/installr o github.com/talgalili/installr
Louis Maddox

1
Esegui Rgui.exe da C: \ Programmi \ R \ R-3.6.0 \ bin \ i386 e scrivere il codice per la console: install.packages(installr); library(installr); updateR(TRUE). Alla fine, [1] TRUEappare. Con l'eccellente pacchetto di Galili, sono passato da R 3.6.0 a R 3.6.1 molto facilmente. Grazie Tal.
Erdogan CEVHER,

2

Due opzioni:

  1. Implementa la mia risposta qui
  2. Se usi R in Eclipse con StatET, apri Esegui configurazioni , fai clic sulla scheda Console e nella casella chiamata R snippet esegui dopo l'avvio aggiungi questa riga con la tua scelta di directory:.libPaths("C:/R/library")

1

Sono su Windows 8 e per qualche strana ragione, non riesco mai a installare pacchetti usando le mie connessioni Internet.

In genere lo installo usando il file .zip di CRAN.

Dopo sono passato da R 3.2.5 a R 3.3.1.

Ho semplicemente copiato i pacchetti da

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

E poi ho riavviato la sessione R. Ha funzionato perfettamente. Non ho verificato se TUTTI i pacchetti funzionano bene. Ma quelli che ho controllato funzionano perfettamente. Spero che questo hack funzioni per tutti.

Saluti.


1

La risposta accettata potrebbe funzionare se hai lungimiranza, ma mi ero già sbarazzato della vecchia versione, quindi non ero in grado di seguire queste indicazioni. I passaggi descritti di seguito hanno funzionato per l'aggiornamento di OSX da 2.1 e 3.1.

AGGIORNATO: Per ottenere la directory per la versione più recente (invece di digitare 3.1 o 3.2) è possibile utilizzare i comandi seguenti. Il secondo converte direttamente nella variabile R, saltando .e ..e .DS_Store, usare:

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 "/" 

(Aggiungi |pbcopyalla fine per copiarlo direttamente negli appunti del tuo Mac)

Quindi all'interno di R puoi incollare quella variabile che viene generata. Una volta definito nella nuova versione di R, è possibile scorrere i pacchetti installati dalle istruzioni sopra ...

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

0

per me questa pagina è buona https://www.r-statistics.com/2013/03/updating-r-from-r-on-windows-using-the-installr-package/ o un'altra opzione è semplicemente installare il nuovo opzione e alla fine hai messo, per esempio in Windows nel mio pc

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

ogni percorso dell'ultima versione nel mio caso ho sempre messo il primo percorso è "D: /Documents/R/win-library/3.2" che è stato risolto e quindi ho messo l'altro perché non è necessario copiare o spostare alcun pacchetto, in il mio sugest lo chiama e basta


0

linux+ bash+ debian+ aptutenti:

  1. Se stai installando / aggiornando alla versione più recente di R, allora possiamo presumere che tu abbia le rootautorizzazioni. (Non essenziale, rende il processo molto più semplice; per coerenza lo script seguente utilizza sudoper tutte le installazioni.) Dato che anche i Rpacchetti sono installati da root, è quindi possibile inserirli /usr/local/.

  2. La chiamata al di curlsotto presuppone che tu sia già interessato al sidrilascio Rdell'ultima versione instabile (come richiesto durante la creazione / verifica di un Rpacchetto)

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

    sebbene ciò possa essere facilmente sostituito con una recente versione stabile, ad es buster.

  3. Si noti che sto non usando un tasto come è tipicamente consigliato . Questo non è essenziale, in particolare se (come nello script che segue) installiamo i pacchetti al R suo interno ( Rscript -esotto). Inoltre, tali chiavi hanno la tendenza a rompersi / cambiare ogni pochi anni. Pertanto, sei ovviamente il benvenuto ad aggiungere la seguente prefazione al file R.shche segue:

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

  4. Il arraydi Rpacchetti non è chiaramente esaustivo, ma fornisce alcuni esempi che io personalmente trovo utili. Una nuova installazione / aggiornamento con il debianpacchetto r-recommended, come di seguito, dovrebbe fornire l'ultima versione di tutti i pacchetti standard "raccomandati" (ad es survival.). Credo che potrebbe esserci un leggero ritardo tra una versione CRAN e un aggiornamento del debianpacchetto pertinente . Pertanto, potresti voler aggiungere alcuni di questi al arrayseguito se Rè essenziale disporre dell'ultima versione di un pacchetto "raccomandato" .

  5. I debianpacchetti installati nel processo di seguito non sono né essenziali (per l'utilizzo r-base) né esaustivi, ma forniscono un no. di "componenti aggiuntivi" che sono importanti per un ragionevole no. di Rpacchetti.

Ad ogni modo ... inserisci quanto segue 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

Poi eseguirlo, ad esempio assumendo in directory già: source R.sh.

L'installazione di pacchetti ( unodebian o l'altro R) uno alla volta in un loop dalla shell è in qualche modo inefficiente, ma consente una più semplice traccia degli errori, IMHO. Potrebbe richiedere del tempo a seconda del no. di Rpacchetti, quindi forse il più semplice lasciar correre durante la notte ...


1
Non sono sicuro del perché la "sopravvivenza" sia inclusa in tale elenco di pacchetti supplementari. (Ed è del tutto possibile che sto fuorviando questo script bash.) È stato un pacchetto "consigliato" da ... per sempre. Se non si installano tutti i pacchetti consigliati con quello script, è necessario modificarli per farlo. Pensa anche che il set di pacchetti r-base-devel sarebbe necessario per chiunque usi Linux. E perché non aggiungere il PPA di Michael Rutter?
IRTFM,

Grazie! Aggiornato alla luce dei tuoi utili commenti. Accetto, non è necessario installare abitualmente un pacchetto già presente r-recommended. 'r-base-devel' è noto come r-base-dev( debianpacchetto) - era già incluso. Non sono contrario all'utilizzo di una chiave per la sicurezza (risposta aggiornata). La risposta rimane lontana dall'uso di un PPA= Archivi del pacchetto personale in quanto questi sono necessariamente dipendenti da una persona e quindi potenzialmente fallibili. Come dice lo stesso Michael Rutter (2012): "Se hai utilizzato CRAN, non c'è motivo di cambiare il PPA, poiché gli stessi pacchetti sono forniti in entrambe le posizioni."
dardisco,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.