Ich verwende folgende Funktion, um das Paket zu installieren, wenn require("<package>")
wird mit dem Fehler "Paket nicht gefunden" beendet. Es wird sowohl CRAN als auch Bioconductor Repositories nach fehlenden Paketen abfragen.
Nach dem Originalwerk von Joshua Wiley, http://r.789695.n4.nabble.com/Install-package-automatically-if-not-there-td2267532.html
install.packages.auto <- function(x) {
x <- as.character(substitute(x))
if(isTRUE(x %in% .packages(all.available=TRUE))) {
eval(parse(text = sprintf("require(\"%s\")", x)))
} else {
#update.packages(ask= FALSE) #update installed packages.
eval(parse(text = sprintf("install.packages(\"%s\", dependencies = TRUE)", x)))
}
if(isTRUE(x %in% .packages(all.available=TRUE))) {
eval(parse(text = sprintf("require(\"%s\")", x)))
} else {
source("http://bioconductor.org/biocLite.R")
#biocLite(character(), ask=FALSE) #update installed packages.
eval(parse(text = sprintf("biocLite(\"%s\")", x)))
eval(parse(text = sprintf("require(\"%s\")", x)))
}
}
Beispiel:
install.packages.auto(qvalue) # from bioconductor
install.packages.auto(rNMF) # from CRAN
PS: update.packages(ask = FALSE)
& biocLite(character(), ask=FALSE)
werden alle installierten Pakete auf dem System aktualisiert. Dies kann sehr lange dauern und ist wie ein vollständiges R-Upgrade zu betrachten, das nicht immer gerechtfertigt ist!
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?