Molte delle risposte sopra (e sui duplicati di questa domanda) si basano su installed.packages
quale sia la cattiva forma. Dalla documentazione:
Questo può essere lento quando sono installati migliaia di pacchetti, quindi non utilizzarlo per scoprire se è installato un pacchetto denominato (usa system.file o find.package) né per sapere se un pacchetto è utilizzabile (chiama richiede e controlla il valore di ritorno) né per trovare i dettagli di un numero limitato di pacchetti (usare packageDescription). Deve leggere diversi file per pacchetto installato, che sarà lento su Windows e su alcuni file system montati in rete.
Quindi, un approccio migliore è tentare di caricare il pacchetto usando ee require
installarlo se il caricamento fallisce ( require
tornerà FALSE
se non viene trovato). Preferisco questa implementazione:
using<-function(...) {
libs<-unlist(list(...))
req<-unlist(lapply(libs,require,character.only=TRUE))
need<-libs[req==FALSE]
if(length(need)>0){
install.packages(need)
lapply(need,require,character.only=TRUE)
}
}
che può essere usato in questo modo:
using("RCurl","ggplot2","jsonlite","magrittr")
In questo modo carica tutti i pacchetti, quindi torna indietro e installa tutti i pacchetti mancanti (che, se lo si desidera, è un posto utile in cui inserire un prompt per chiedere se l'utente desidera installare i pacchetti). Invece di chiamare install.packages
separatamente per ogni pacchetto, passa l'intero vettore di pacchetti disinstallati una sola volta.
Ecco la stessa funzione ma con una finestra di dialogo di Windows che chiede se l'utente desidera installare i pacchetti mancanti
using<-function(...) {
libs<-unlist(list(...))
req<-unlist(lapply(libs,require,character.only=TRUE))
need<-libs[req==FALSE]
n<-length(need)
if(n>0){
libsmsg<-if(n>2) paste(paste(need[1:(n-1)],collapse=", "),",",sep="") else need[1]
print(libsmsg)
if(n>1){
libsmsg<-paste(libsmsg," and ", need[n],sep="")
}
libsmsg<-paste("The following packages could not be found: ",libsmsg,"\n\r\n\rInstall missing packages?",collapse="")
if(winDialog(type = c("yesno"), libsmsg)=="YES"){
install.packages(need)
lapply(need,require,character.only=TRUE)
}
}
}
R version 3.0.2 (2013-09-25) x86_64-w64-mingw32/x64 (64-bit)
.