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.

7voto

Alex Essilfie Punkte 11993

Sie können einfach die setdiff Funktion, um die nicht installierten Pakete zu ermitteln und zu installieren. Im folgenden Beispiel prüfen wir, ob das ggplot2 y Rcpp Pakete installiert sind, bevor sie installiert werden.

unavailable <- setdiff(c("ggplot2", "Rcpp"), rownames(installed.packages()))
install.packages(unavailable)

In einer Zeile kann die obige Aussage wie folgt geschrieben werden:

install.packages(setdiff(c("ggplot2", "Rcpp"), rownames(installed.packages())))

7voto

Aurèle Punkte 11229

Die aktuelle Version von RStudio (>=1.2) enthält eine Funktion zur Erkennung fehlender Pakete in library() y require() aufruft und den Benutzer auffordert, sie zu installieren:

Fehlende R-Pakete erkennen

Viele R-Skripte beginnen mit Aufrufen von library() y require() um die Pakete zu laden, die sie für die Ausführung benötigen. Wenn Sie ein R-Skript öffnen, das auf Pakete verweist, die Sie nicht installiert haben, bietet RStudio jetzt an, alle benötigten Pakete mit einem einzigen Klick zu installieren. Kein Eintippen mehr install.packages() wiederholt, bis die Fehler verschwinden!
https://blog.rstudio.com/2018/11/19/rstudio-1-2-preview-the-little-things/

Dies scheint das ursprüngliche Anliegen des Auftraggebers besonders gut zu erfüllen:

Viele von ihnen sind R-Anfänger und wissen nicht, dass sie Pakete installieren müssen, die sie noch nicht haben.

7voto

Erik Shilts Punkte 4231

Dies ist der Zweck der rbundler-Paket : eine Möglichkeit zu bieten, die Pakete zu kontrollieren, die für ein bestimmtes Projekt installiert werden. Momentan arbeitet das Paket mit der devtools-Funktionalität, um Pakete in Ihrem Projektverzeichnis zu installieren. Die Funktionalität ist ähnlich der von Ruby Bündler .

Wenn Ihr Projekt ein Paket ist (empfohlen), dann müssen Sie nur noch rbundler laden und die Pakete bündeln. Die bundle Funktion sieht sich das Paket DESCRIPTION Datei, um zu bestimmen, welche Pakete gebündelt werden sollen.

library(rbundler)
bundle('.', repos="http://cran.us.r-project.org")

Nun werden die Pakete in das Verzeichnis .Rbundle installiert.

Wenn Ihr Projekt kein Paket ist, dann können Sie es vortäuschen, indem Sie ein DESCRIPTION Datei im Root-Verzeichnis Ihres Projekts mit einem Depends-Feld, das die Pakete auflistet, die Sie installieren möchten (mit optionalen Versionsinformationen):

Depends: ggplot2 (>= 0.9.2), arm, glmnet

Hier ist das github repo für das Projekt, wenn Sie daran interessiert sind, einen Beitrag zu leisten: rbundler .

6voto

Dirk Eddelbuettel Punkte 345316

Ja, sicher.

Sie müssen die "installierten Pakete" mit den "gewünschten Paketen" vergleichen. Das ist sehr ähnlich zu dem, was ich mit CRANberries da ich "gespeicherte bekannte Pakete" mit "aktuell bekannten Paketen" vergleichen muss, um neue und/oder aktualisierte Pakete zu ermitteln.

Machen Sie also etwas wie

AP <- available.packages(contrib.url(repos[i,"url"]))   # available t repos[i]

um alle bekannten Pakete zu erhalten, ein ähnlicher Aufruf für aktuell installierte Pakete und ein Vergleich mit einer gegebenen Menge von Zielpaketen.

5voto

Anish Sugathan Punkte 379

Die folgende einfache Funktion funktioniert wie ein Zauberspruch:

  usePackage<-function(p){
      # load a package if installed, else load after installation.
      # Args:
      #   p: package name in quotes

      if (!is.element(p, installed.packages()[,1])){
        print(paste('Package:',p,'Not found, Installing Now...'))
        install.packages(p, dep = TRUE)}
      print(paste('Loading Package :',p))
      require(p, character.only = TRUE)  
    }

(nicht von mir, ich habe es vor einiger Zeit im Internet gefunden und benutze es seither. bin mir der Originalquelle nicht sicher)

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