443 Stimmen

Elegante Methode, um nach fehlenden Paketen zu suchen und sie zu installieren?

Ich scheine in letzter Zeit eine Menge Code mit Koautoren zu teilen. Viele von ihnen sind Anfänger oder fortgeschrittene R-Nutzer und wissen nicht, dass sie Pakete installieren müssen, die sie noch nicht haben.

Gibt es einen eleganten Weg zum Aufruf von installed.packages() vergleichen Sie diese mit denen, die ich lade, und installieren Sie sie, falls sie fehlen?

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.

1voto

Edward Tyler Punkte 697

Hier ist mein Code dafür:

packages <- c("dplyr", "gridBase", "gridExtra")
package_loader <- function(x){
    for (i in 1:length(x)){
        if (!identical((x[i], installed.packages()[x[i],1])){
            install.packages(x[i], dep = TRUE)
        } else {
            require(x[i], character.only = TRUE)
        }
    }
}
package_loader(packages)

1voto

teichert Punkte 2953

In meinem Fall wollte ich einen One-Liner, den ich von der Kommandozeile aus ausführen kann (eigentlich über ein Makefile). Hier ist ein Beispiel für die Installation von "VGAM" und "feather", falls sie nicht bereits installiert sind:

R -e 'for (p in c("VGAM", "feather")) if (!require(p, character.only=TRUE)) install.packages(p, repos="http://cran.us.r-project.org")'

Von R aus wäre es einfach:

for (p in c("VGAM", "feather")) if (!require(p, character.only=TRUE)) install.packages(p, repos="http://cran.us.r-project.org")

Hier gibt es nichts, was über die bisherigen Lösungen hinausgeht:

  • Ich beschränke es auf eine einzige Zeile
  • Ich kodiere hart die repos Parameter (um Popups zu vermeiden, die nach dem zu verwendenden Mirror fragen)
  • Ich mache mir nicht die Mühe, eine Funktion zu definieren, die an anderer Stelle verwendet wird

Beachten Sie auch die wichtigen character.only=TRUE (ohne sie ist die require würde versuchen, das Paket zu laden p ).

1voto

lf_araujo Punkte 1849

Lassen Sie mich ein bisschen Wahnsinn erzählen:

c("ggplot2","ggsci", "hrbrthemes", "gghighlight", "dplyr") %>%  # What will you need to load for this script?
  (function (x) ifelse(t =!(x %in% installed.packages()), 
    install.packages(x[t]),
    lapply(x, require)))

1voto

eliot.mcintire Punkte 101

Es gibt ein neues Paket (ich bin ein Code-Entwickler), Require die Teil eines reproduzierbaren Arbeitsablaufs sein soll, d. h. die Funktion bei der ersten und jeder weiteren Ausführung die gleiche Ausgabe erzeugt d.h. der Endzustand ist unabhängig vom Startzustand derselbe. Im Folgenden werden alle fehlenden Pakete installiert (ich schließe require = FALSE um genau auf die ursprüngliche Frage einzugehen... normalerweise lasse ich dies auf dem Standardwert, weil ich sie im Allgemeinen in den Suchpfad laden möchte).

Diese beiden Zeilen stehen am Anfang jedes Skripts, das ich schreibe (wobei ich die Paketauswahl nach Bedarf anpasse), so dass das Skript von jedermann unter allen Bedingungen verwendet werden kann (einschließlich fehlender oder fehlender Abhängigkeiten).

if (!require("Require")) install.packages("Require")
Require::Require(c("ggplot2", "Rcpp"), require = FALSE)

Sie können dies also in Ihrem Skript verwenden oder es an jemanden weitergeben.

1voto

metasequoia Punkte 6672

Ich verwende das folgende Programm, das prüft, ob das Paket installiert ist und ob die Abhängigkeiten aktualisiert wurden, und dann das Paket lädt.

p<-c('ggplot2','Rcpp')
install_package<-function(pack)
{if(!(pack %in% row.names(installed.packages())))
{
  update.packages(ask=F)
  install.packages(pack,dependencies=T)
}
 require(pack,character.only=TRUE)
}
for(pack in p) {install_package(pack)}

completeFun <- function(data, desiredCols) {
  completeVec <- complete.cases(data[, desiredCols])
  return(data[completeVec, ])
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X