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.

2voto

ruemorgue Punkte 39
 48 lapply_install_and_load <- function (package1, ...)
 49 {
 50     #
 51     # convert arguments to vector
 52     #
 53     packages <- c(package1, ...)
 54     #
 55     # check if loaded and installed
 56     #
 57     loaded        <- packages %in% (.packages())
 58     names(loaded) <- packages
 59     #
 60     installed        <- packages %in% rownames(installed.packages())
 61     names(installed) <- packages
 62     #
 63     # start loop to determine if each package is installed
 64     #
 65     load_it <- function (p, loaded, installed)
 66     {
 67         if (loaded[p])
 68         {
 69             print(paste(p, "loaded"))
 70         }
 71         else
 72         {
 73             print(paste(p, "not loaded"))
 74             if (installed[p])
 75             {
 76                 print(paste(p, "installed"))
 77                 do.call("library", list(p))
 78             }
 79             else
 80             {
 81                 print(paste(p, "not installed"))
 82                 install.packages(p)
 83                 do.call("library", list(p))
 84             }
 85         }
 86     }
 87     #
 88     lapply(packages, load_it, loaded, installed)
 89 }

2voto

Shicheng Guo Punkte 1107
source("https://bioconductor.org/biocLite.R")
if (!require("ggsci")) biocLite("ggsci")

2voto

George Shimanovsky Punkte 1420

Mit der Lapply-Familie und dem anonymen Funktionsansatz können Sie:

  1. Versuchen Sie, alle aufgeführten Pakete anzuhängen.
  2. Nur fehlende Installationen (mit || faule Bewertung).
  3. Versuchen Sie, die in Schritt 1 fehlenden und in Schritt 2 installierten Elemente erneut anzubringen.
  4. Druckt den endgültigen Ladestatus jedes Pakets ( TRUE / FALSE ).

    req <- substitute(require(x, character.only = TRUE))
    lbs <- c("plyr", "psych", "tm")
    sapply(lbs, function(x) eval(req) || {install.packages(x); eval(req)})
    
    plyr psych    tm 
    TRUE  TRUE  TRUE

2voto

GeoObserver Punkte 118

Was Ihr Hauptziel betrifft, "Bibliotheken zu installieren, die sie noch nicht haben. " und unabhängig von der Verwendung von " instllaed.packages() ". Die folgende Funktion maskiert die ursprüngliche Funktion von require. Sie versucht, das benannte Paket "x" zu laden und zu prüfen, wenn es nicht installiert ist, es direkt zu installieren, einschließlich der Abhängigkeiten, und es schließlich normal zu laden. Sie benennen den Funktionsnamen von "require" in "library" um, um die Integrität zu wahren. Die einzige Einschränkung ist, dass Paketnamen in Anführungszeichen gesetzt werden sollten.

require <- function(x) { 
  if (!base::require(x, character.only = TRUE)) {
  install.packages(x, dep = TRUE) ; 
  base::require(x, character.only = TRUE)
  } 
}

Sie können also ein Paket auf die altmodische Weise von R laden und installieren. require ("ggplot2") require ("Rcpp")

1voto

s n Punkte 21
library <- function(x){
  x = toString(substitute(x))
if(!require(x,character.only=TRUE)){
  install.packages(x)
  base::library(x,character.only=TRUE)
}}

Dies funktioniert mit nicht-quotierten Paketnamen und ist ziemlich elegant (vgl. GeoObservers Antwort)

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