domenica 1 settembre 2024

Lista dei pacchetti aggiuntivi e aggiornamento di R

Dal Menù dell'interfaccia grafica di R (RGui) alla voce Pacchetti selezionando Carica pacchetto... compare l'elenco dei pacchetti installati  – sia i pacchetti previsti di default nella installazione base di R sia i pacchetti aggiuntivi installati dall'utente – che con l'opzione Aggiorna pacchetti... possono (e devono) essere periodicamente aggiornati.


Uno script che genera l'elenco dei pacchetti installati sembrerebbe quindi superfluo, ma voglio dimostrare che non è esattamente così.

Ora copiate e incollate nella Console di R questo script e premete ↵ Invio.

# GENERA LA LISTA DEI PACCHETTI DELL'INSTALLAZIONE ORIGINARIA
#
pacchetti <- as.data.frame(installed.packages()[,c(1:3)], row.names=FALSE) # genera la lista
pacchetti # mostra la lista
write.csv(pacchetti, "C:/Rdati/pacchetti.csv") # salva la lista
#

La prima riga di codice genera la lista di tutti i pacchetti installati e ne salva nella tabella pacchetti i primi tre campi [,c(1:3)] che sono il nome del pacchetto (Package), la sua ubicazione nel PC (LibPath), e la versione installata (Version), mentre la seconda riga mostra la lista nella Console di R.

> pacchetti # mostra la lista
              Package                                        LibPath    Version
1               abind C:/Users/xxxxx/AppData/Local/R/win-library/x.x      x.x.x
2             askpass C:/Users/xxxxx/AppData/Local/R/win-library/x.x      x.x.x
3           backports C:/Users/xxxxx/AppData/Local/R/win-library/x.x      x.x.x
4           base64enc C:/Users/xxxxx/AppData/Local/R/win-library/x.x      x.x.x
5         BayesFactor C:/Users/xxxxx/AppData/Local/R/win-library/x.x      x.x.x
6          bayestestR C:/Users/xxxxx/AppData/Local/R/win-library/x.x      x.x.x
7           BiasedUrn C:/Users/xxxxx/AppData/Local/R/win-library/x.x      x.x.x
8              bitops C:/Users/xxxxx/AppData/Local/R/win-library/x.x      x.x.x
..........
272           splines             C:/Program Files/R/R-x.x.x/library      x.x.x
273             stats             C:/Program Files/R/R-x.x.x/library      x.x.x
274            stats4             C:/Program Files/R/R-x.x.x/library      x.x.x
275          survival             C:/Program Files/R/R-x.x.x/library      x.x.x
276             tcltk             C:/Program Files/R/R-x.x.x/library      x.x.x
277             tools             C:/Program Files/R/R-x.x.x/library      x.x.x
278      translations             C:/Program Files/R/R-x.x.x/library      x.x.x
279             utils             C:/Program Files/R/R-x.x.x/library      x.x.x

Tre precisazioni:
 se dal codice togliete [,c(1:3)] la lista generata comprenderà tutti i campi previsti nelle specifiche dei pacchetti;
 i pacchetti ubicati in C:/Program Files/R/R-x.x.x/library (dove x.x.x è la versione di R) sono quelli previsti di default nella installazione base di R;
 quelli ubicati in C:/Users/xxxxx/AppData/Local/R/win-library/x.x  (dove xxxxx è il nome dell'utente e x.x la versione di R) sono i pacchetti aggiuntivi installati dall'utente.

La terza riga di codice dello script salva la lista nel file C:\Rdati\pacchetti.csv (da notare che \ è la barra rovesciata o backslash impiegata da Windows come separatore tra i nomi delle directory nel percorso di un file, mentre R impiega la barra obliqua o slash).

Ed è qui che la cosa si fa interessante, perché disporre di un file con i nomi dei pacchetti installati consente di riprodurre una installazione dei pacchetti aggiuntivi identica a quella corrente:
 quando si installa un aggiornamento maggiore di R a una nuova versione, indicato da un cambiamento nella prima e/o nella seconda cifra della versione (i.e.: X.X.x oppure x.X.x);
 quando si installa R ex novo su un altro PC;
 quando si vogliono aggiungere all'installazione preesistente su un altro PC i pacchetti impiegati nell'installazione corrente.

Mentre quando cambia solamente la terza cifra del numero della versione (i.e.: x.x.X) questo viene considerata un aggiornamento minore ed è sufficiente disinstallare la versione corrente, installare la nuova versione, ed effettuare l'aggiornamento dei pacchetti (Pacchetti >> Aggiorna pacchetti...), nel caso di una aggiornamento maggiore ci sono tre opzioni:
 fare coesistere diverse versioni di R e delle relative librerie (cosa che può comportare problemi);
 disinstallare la versione corrente di R e installarne una nuova senza modificare le librerie (queste poi devono essere aggiornate seguendo le indicazioni che si trovano online, ma anche in questo caso si può andare incontro a problemi);
 procedere ogni volta con una installazione pulita di R, che prevede di disinstallare la versione corrente di R, di cestinare tutte le librerie eliminando C:/Users/xxxxx/AppData/Local/R/win-library/x.x e reinstallarle tutte daccapo (opzione consigliata).

Installazione pulita di R

In questo caso, che mette sicuramente al riparo da qualsiasi problema, il primo passo prevede di:
 generare la lista dei pacchetti dell'installazione originaria e salvarla impiegando la script riportato sopra;
 disinstallare R;
→ rimuovere C:/Users/xxxxx/AppData/Local/R/win-library/x.x dove xxxxx è il nome dell'utente e x.x è la versione di R appena disinstallata, eliminando così tutte le librerie;
 installare la nuova versione di R con le opzioni di default.

Il secondo passo prevede di leggere il file che contiene i pacchetti dell'installazione originaria (O) che si intende replicare e che al passo precedente avete salvato come C:/Rdati/pacchetti.csv:  

# IMPORTA LA LISTA DEI PACCHETTI DELL'INSTALLAZIONE ORIGINARIA (O)
#
pacchetti_O <- read.csv("C:/Rdati/pacchetti.csv")[c(-1)] # legge la lista
pacchetti_O # mostra la lista
#

Il terzo passo consiste nel generare la lista dei pacchetti installati localmente (L) e che, con la installazione pulita di R, comprenderà solamente i pacchetti installati di default in C:/Program Files/R/R-x.x.x/library (dove x.x.x è la versione di R):

# GENERA LA LISTA DEI PACCHETTI INSTALLATI LOCALMENTE (L)
#
pacchetti_L <- as.data.frame(installed.packages()[,c(1:3)], row.names=FALSE) # genera la lista
pacchetti_L # mostra la lista
#

Il quarto passo è generare la lista dei pacchetti aggiuntivi mancanti da installare (M) come differenza tra quelli dell'installazione originaria e quelli già installati localmente (M = O - L). Questa differenza esclude i pacchetti dell'installazione base di R, per definizione già installati localmente, e lascia nella lista solamente i pacchetti aggiuntivi della precedente installazione:

# GENERA LA LISTA DEI PACCHETTI AGGIUNTIVI MANCANTI DA INSTALLARE (M = O - L)
#
pacchetti_M <- setdiff(pacchetti_O$Package, pacchetti_L$Package) # genera la lista
pacchetti_M # mostra la lista
#

Il quinto e ultimo passo consiste nell'installazione dei pacchetti aggiuntivi mancanti (M) che verranno quindi aggiunti a quelli installati di default:

# INSTALLA I PACCHETTI AGGIUNTIVI MANCANTI (M)
#
install.packages(pacchetti_M) # installa i pacchetti mancanti
#

A questo punto confermare con SI le specifiche di configurazione proposte,



quindi selezionare il CRAN preferito, dal quale effettuare il download dei pacchetti (sotto Italy trovate Milano e Padua, io per inveterata abitudine mi collego a Padua che è stato il primo dei due in Italia a implementare la modalità "sicura" https e funziona molto bene, ma ovviamente i due si equivalgono).


Nella Console di R vedrete scorrere il download dei pacchetti e la loro installazione, che include la verifica dell'integrità dei file scaricati. Se i pacchetti aggiuntivi sono molti serve pazienza, attendere il completamento della procedura. Va da sé che i pacchetti installati saranno tutti nella versione più aggiornata.

La procedura qui riportata è stata validata con diverse successive versioni di R per Windows 64 bit, eseguendola più volte su differenti PC con Windows 11 e riproducendo una installazione originaria di oltre 270 pacchetti contenenti oltre 12 000 file, senza alcun problema.


----------

Codice opportunamente modificato e adattato da un post di Roberto Chiosa:
https://robertochiosa.medium.com/import-export-r-packages-a6a122005e00

Nessun commento:

Posta un commento