Wiele powyższych odpowiedzi (i duplikatów tego pytania) opiera się na installed.packages
złej formie. Z dokumentacji:
Może to być powolne, gdy tysiące pakietów są zainstalowane, więc nie używaj tego, aby dowiedzieć się, czy nazwany pakiet jest zainstalowany (użyj pliku system.file lub find.package), ani nie dowiedz się, czy pakiet jest użyteczny (wywołanie wymaga i sprawdź wartość zwracana) ani w celu znalezienia szczegółów niewielkiej liczby pakietów (użyj packageDescription). Musi odczytać kilka plików na zainstalowany pakiet, co będzie wolne w systemie Windows i niektórych systemach plików podłączonych do sieci.
Lepszym rozwiązaniem jest próba załadowania pakietu przy użyciu require
i instalacji, jeśli ładowanie się nie powiedzie ( require
zwróci, FALSE
jeśli nie zostanie znalezione). Wolę tę implementację:
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)
}
}
które mogą być użyte w ten sposób:
using("RCurl","ggplot2","jsonlite","magrittr")
W ten sposób ładuje wszystkie pakiety, a następnie wraca i instaluje wszystkie brakujące pakiety (co jeśli chcesz, to przydatne miejsce, aby wstawić monit z pytaniem, czy użytkownik chce zainstalować pakiety). Zamiast wywoływać install.packages
osobno dla każdego pakietu, przekazuje cały wektor odinstalowanych pakietów tylko raz.
Oto ta sama funkcja, ale z oknem dialogowym z pytaniem, czy użytkownik chce zainstalować brakujące pakiety
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)
.