Un sacco di risposte di cui sopra (e su duplicati di questa domanda) si basano su installed.packages
che è di cattivo gusto. Dalla documentazione:
Questo può essere lento quando sono installate migliaia di pacchetti, in modo da non utilizzare questo per scoprire se è installato un pacchetto chiamato (uso system.file o find.package), né per scoprire se un pacchetto è utilizzabile (richiede la chiamata e controlla il valore restituito) e non trova i dettagli di un piccolo numero di pacchetti (usa packageDescription). Ha bisogno di leggere diversi file per pacchetto installato, che sarà lento su Windows e su alcuni file system montati in rete.
Quindi, un approccio migliore è quello di tentare di caricare il pacchetto utilizzando require
e installare e se il caricamento non riesce (require
tornerà FALSE
se non si trova). Io 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 utilizzato in questo modo:
using("RCurl","ggplot2","jsonlite","magrittr")
In questo modo si carica tutti i pacchetti, poi torna e installa tutti i pacchetti mancanti (che se si vuole, è un posto a portata di mano per inserire un prompt per chiedere se l'utente vuole 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 vuole 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)
}
}
}
@krlmlr E la risposta accettata non è aggiornata e richiede una revisione? Funziona per me (per alcuni test rapidi) sotto 'R versione 3.0.2 (2013-09-25) x86_64-w64-mingw32/x64 (64-bit)'. –
@BrianDiggs: sono comparsi almeno tre pacchetti che risolvono questo problema, solo uno è referenziato di seguito. C'è ancora di più - questa è la domanda. – krlmlr
@krlmlr Sembra esserci un po 'di ironico problema di pollo e uova sull'utilizzo di un pacchetto per garantire (altri) pacchetti necessari. Ma certamente vale la pena di avere una persona che sa di loro scrivere una risposta. –