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.

5voto

Samir Punkte 686

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!

5voto

hplieninger Punkte 2905

Heute bin ich über zwei praktische Funktionen gestolpert, die vom rlang-Paket bereitgestellt werden, nämlich, is_installed() y check_installed() .

Von der Hilfeseite (Hervorhebung hinzugefügt):

Diese Funktionen überprüfen, ob die Pakete mit minimalen Nebenwirkungen installiert werden. Falls installiert, werden die Pakete geladen, aber nicht angehängt.

is_installed() interagiert nicht mit dem Benutzer. Sie gibt lediglich TRUE o FALSE je nachdem, ob die Pakete installiert sind.

Unter interaktive Sitzungen , check_installed() fragt den Benutzer, ob fehlende Pakete installiert werden sollen . Wenn der Benutzer zustimmt, werden die Pakete installiert [...]. Ist die Sitzung nicht interaktiv oder entscheidet sich der Benutzer, die Pakete nicht zu installieren, wird die aktuelle Auswertung abgebrochen.

interactive()
#> [1] FALSE
rlang::is_installed(c("dplyr"))
#> [1] TRUE
rlang::is_installed(c("foobarbaz"))
#> [1] FALSE
rlang::check_installed(c("dplyr"))
rlang::check_installed(c("foobarbaz"))
#> Error:
#> ! The package `foobarbaz` is required.

Erstellt am 2022-03-25 von der Reprex-Paket (v2.0.1)

3voto

Ben Punkte 2008

Ich dachte, ich würde das von mir benutzte Modell beisteuern:

testin <- function(package){if (!package %in% installed.packages())    
install.packages(package)}
testin("packagename")

3voto

jangorecki Punkte 15157

Eine ganz einfache.

pkgs = c("pacman","data.table")
if(length(new.pkgs <- setdiff(pkgs, rownames(installed.packages())))) install.packages(new.pkgs)

3voto

Pratik Patil Punkte 3364

Ich habe die Funktion zum Installieren und Laden der erforderlichen R-Pakete im Hintergrund implementiert. Ich hoffe, das könnte helfen. Hier ist der Code:

# Function to Install and Load R Packages
Install_And_Load <- function(Required_Packages)
{
    Remaining_Packages <- Required_Packages[!(Required_Packages %in% installed.packages()[,"Package"])];

    if(length(Remaining_Packages)) 
    {
        install.packages(Remaining_Packages);
    }
    for(package_name in Required_Packages)
    {
        library(package_name,character.only=TRUE,quietly=TRUE);
    }
}

# Specify the list of required packages to be installed and load    
Required_Packages=c("ggplot2", "Rcpp");

# Call the Function
Install_And_Load(Required_Packages);

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