Viele der obigen Antworten (und auf Duplikate dieser Frage) stützen sich auf installed.packages
was eine schlechte Form ist. Aus der Dokumentation:
Dies kann langsam sein, wenn Tausende von Paketen installiert sind. Verwenden Sie dies also nicht, um herauszufinden, ob ein benanntes Paket installiert ist (verwenden Sie system.file oder find.package), oder um herauszufinden, ob ein Paket verwendbar ist (rufen Sie require auf und prüfen Sie den Rückgabewert), oder um Details über eine kleine Anzahl von Paketen zu finden (verwenden Sie packageDescription). Es muss mehrere Dateien pro installiertem Paket lesen, was unter Windows und auf einigen im Netzwerk eingebundenen Dateisystemen langsam ist.
Ein besserer Ansatz ist es also, zu versuchen, das Paket mit require
und installieren, wenn das Laden fehlschlägt ( require
wird zurückgegeben FALSE
wenn es nicht gefunden wird). Ich bevorzuge diese Implementierung:
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)
}
}
die wie folgt verwendet werden kann:
using("RCurl","ggplot2","jsonlite","magrittr")
Auf diese Weise werden alle Pakete geladen, dann werden alle fehlenden Pakete installiert (dies ist ein praktischer Ort, um eine Eingabeaufforderung einzufügen, die den Benutzer fragt, ob er Pakete installieren möchte). Anstatt den Aufruf install.packages
separat für jedes Paket übergibt es den gesamten Vektor der deinstallierten Pakete nur einmal.
Hier ist die gleiche Funktion, aber mit einem Windows-Dialog, der den Benutzer fragt, ob er die fehlenden Pakete installieren möchte
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)
}
}
}
1 Stimmen
@krlmlr Was ist mit der akzeptierten Antwort, die nicht mehr aktuell ist und überarbeitet werden muss? Bei mir funktioniert es (für ein paar schnelle Tests) unter
R version 3.0.2 (2013-09-25) x86_64-w64-mingw32/x64 (64-bit)
.1 Stimmen
@BrianDiggs: Es sind mindestens drei Pakete aufgetaucht, die sich mit diesem Problem befassen, nur auf eines wird unten verwiesen. Gibt es noch mehr - das ist die Frage.
3 Stimmen
@krlmlr Es scheint eine Art ironisches Huhn-Ei-Problem zu geben, wenn man ein Paket verwendet, um sicherzustellen, dass (andere) notwendige Pakete haben. Aber es ist sicher wert, dass jemand, der sich damit auskennt, eine Antwort schreibt.
2 Stimmen
@BrianDiggs: Das Bootstrapping dieses Installationsprüfungspakets ist ein notwendiges Ärgernis, aber ein kleines. Es sei denn, natürlich, die Funktionalität findet ihren Weg in
base
... ;-)1 Stimmen
Wenn man von Node.js kommt, ist es wahnsinnig, wie schwer das ist. Wie ist dies nicht eine erstklassige Funktion der Sprache?