Ich scheine heutzutage viel Code mit Mitautoren zu teilen. Viele von ihnen sind Anfänger / Fortgeschrittene und wissen nicht, dass sie Pakete installieren müssen, die sie noch nicht haben.
Gibt es eine elegante Möglichkeit zum Aufrufen installed.packages()
, vergleichen Sie diese mit denen, die ich lade und installiere, wenn sie fehlen?
R version 3.0.2 (2013-09-25) x86_64-w64-mingw32/x64 (64-bit)
.base
... ;-)Antworten:
Ja. Wenn Sie eine Paketliste haben, vergleichen Sie diese mit der Ausgabe von
installed.packages()[,"Package"]
und installieren Sie die fehlenden Pakete. Etwas wie das:Andernfalls:
Wenn Sie Ihren Code in ein Paket einfügen und diese abhängig machen, werden sie automatisch installiert, wenn Sie Ihr Paket installieren.
quelle
if(length(new.packages)>0) {install.packages(new.packages)}
new.packages <- c(1,2)
length(new.packages)
if(length(new.packages)){print("hello!")}else{print("oh no!")}
require
anstatt zu überprüfeninstalled.packages
packrat
wurde dafür gemacht. Es ist ein reproduzierbares Paketverwaltungssystem. Dieser Weg geht falsch vor und beeinträchtigt die Umgebung eines anderen und ist nicht reproduzierbar. Packrat hat einen eigenen Ordner und eine eigene Umgebung für die gemeinsam genutzten Bibliotheken. rstudio.github.io/packratDason K. und ich haben das Pacman- Paket, das das gut kann. Die Funktion
p_load
im Paket erledigt dies. Die erste Zeile soll nur sicherstellen, dass Pacman installiert ist.quelle
/
und, falls gefunden, automatisch von github installiert / geladen wird.if (!require("pacman")) install.packages("pacman")
es in pacman eine Funktion namens gibtp_boot()
, die diese Zeile automatisch für Sie erstellt und in die Zwischenablage kopiert.Sie können einfach den Rückgabewert von verwenden
require
:Ich verwende
library
nach der Installation, weil es eine Ausnahme auslöst, wenn die Installation nicht erfolgreich war oder das Paket aus einem anderen Grund nicht geladen werden kann. Sie machen dies robuster und wiederverwendbarer:Der Nachteil dieser Methode ist, dass Sie den Paketnamen in Anführungszeichen setzen müssen, was Sie nicht wirklich tun
require
.quelle
character.only = TRUE
in verwendenrequire
, aber dann gibt es wohl nichts, was Ihre Antwort von meiner unterscheidet."ggplot2" ist das Paket. Es wird überprüft, ob das Paket installiert ist. Wenn dies nicht der Fall ist, wird es installiert. Anschließend wird das Paket geladen, unabhängig davon, welchen Zweig es verwendet hat.
quelle
Diese Lösung verwendet einen Zeichenvektor mit Paketnamen und versucht, diese zu laden oder zu installieren, wenn das Laden fehlschlägt. Es hängt vom Rückgabeverhalten ab
require
, dies zu tun, weil ...Daher können wir einfach sehen, ob wir das erforderliche Paket laden konnten, und wenn nicht, installieren Sie es mit Abhängigkeiten. Geben Sie also einen Zeichenvektor für Pakete an, die Sie laden möchten ...
quelle
require
nach der Installation nicht erneut anrufen ?if
Anweisung ausgewertet werden kann, muss sie zuerst ausgewertetrequire
werden. Der Nebeneffekt ist, dass das Paket geladen wird, wenn es verfügbar ist!install.packages
, da dies das Paket nicht wirklich laden würde. Aber (zu @krlmlr) Ich vermute, die Absicht ist, dass dieses Codefragment nur einmal aufgerufen wird; Sie würden dies nicht jedes Mal schreiben, wenn Sie das Paket benötigen. Stattdessen würden Sie es einmal im Voraus ausführen und dannrequire
wie gewohnt anrufen .require
Anruf zu tätigen ,library
damit er lautstark fehlschlägt, wenn das Paket aus irgendeinem Grund immer noch nicht angehängt werden kann?Viele der obigen Antworten (und Duplikate dieser Frage) hängen davon ab,
installed.packages
welche Form schlecht ist. Aus der Dokumentation:Ein besserer Ansatz ist es also, zu versuchen, das Paket mit
require
und zu laden und zu installieren, wenn das Laden fehlschlägt (require
wird zurückgegeben,FALSE
wenn es nicht gefunden wird). Ich bevorzuge diese Implementierung:welches so verwendet werden kann:
Auf diese Weise werden alle Pakete geladen, dann zurückgegangen und alle fehlenden Pakete installiert (wenn Sie möchten, können Sie eine Eingabeaufforderung einfügen, um zu fragen, ob der Benutzer Pakete installieren möchte). Anstatt anzurufen
install.packages
jedes Paket separat der gesamte Vektor deinstallierter Pakete nur einmal übergeben.Hier ist dieselbe Funktion, jedoch mit einem Windows-Dialogfeld, in dem Sie gefragt werden, ob der Benutzer die fehlenden Pakete installieren möchte
quelle
Obwohl die Antwort von Shane wirklich gut ist, musste ich für eines meiner Projekte die Ausgangsmeldungen, Warnungen entfernen und Pakete automatisch installieren . Ich habe es endlich geschafft, dieses Skript zu bekommen:
Verwenden:
quelle
quelle
Dies ist der Zweck des rbundler-Pakets : eine Möglichkeit zur Steuerung der Pakete bereitzustellen, die für ein bestimmtes Projekt installiert werden. Derzeit arbeitet das Paket mit der devtools-Funktionalität, um Pakete im Verzeichnis Ihres Projekts zu installieren. Die Funktionalität ist ähnlich wie Ruby bundler .
Wenn Ihr Projekt ein Paket ist (empfohlen), müssen Sie nur rbundler laden und die Pakete bündeln. Die
bundle
Funktion überprüft dieDESCRIPTION
Datei Ihres Pakets, um festzustellen, welche Pakete gebündelt werden sollen.Jetzt werden die Pakete im Verzeichnis .Rbundle installiert.
Wenn Ihr Projekt kein Paket ist, können Sie es fälschen, indem Sie eine
DESCRIPTION
Datei im Stammverzeichnis Ihres Projekts mit einem Depends-Feld erstellen, in dem die zu installierenden Pakete aufgeführt sind (mit optionalen Versionsinformationen):Hier ist das Github-Repo für das Projekt, wenn Sie daran interessiert sind, einen Beitrag zu leisten: rbundler .
quelle
Sicher.
Sie müssen 'installierte Pakete' mit 'gewünschten Paketen' vergleichen. Das kommt meiner Arbeit mit CRANberries sehr nahe, da ich "gespeicherte bekannte Pakete" mit "derzeit bekannten Paketen" vergleichen muss, um neue und / oder aktualisierte Pakete zu ermitteln.
Also mach so etwas
Um alle bekannten Pakete zu erhalten, rufen Sie einfach die aktuell installierten Pakete auf und vergleichen Sie diese mit einem bestimmten Satz von Zielpaketen.
quelle
Verwenden Sie diese
packrat
Option, damit die gemeinsam genutzten Bibliotheken exakt identisch sind und die Umgebung anderer nicht ändern.In Bezug auf Eleganz und Best Practice denke ich, dass Sie grundsätzlich falsch vorgehen. Das Paket
packrat
wurde für diese Probleme entwickelt. Es wird von RStudio von Hadley Wickham entwickelt. Anstatt Abhängigkeiten installieren zu müssen und möglicherweise das Umgebungssystem einer anderen Person durcheinander zu bringen,packrat
verwendet sie ein eigenes Verzeichnis und installiert dort alle Abhängigkeiten für Ihre Programme und berührt nicht die Umgebung einer anderen Person.https://rstudio.github.io/packrat/
quelle
Die folgende einfache Funktion wirkt wie ein Zauber:
(nicht meins, habe dies vor einiger Zeit im Internet gefunden und benutze es seitdem. Ich bin mir der Originalquelle nicht sicher.)
quelle
Ich benutze folgende Funktion, um Paket zu installieren, wenn
require("<package>")
Beenden mit dem Fehler "Paket nicht gefunden" beendet wird. Es werden sowohl CRAN- als auch Bioconductor-Repositorys nach fehlenden Paketen abgefragt.Adaptiert von der Originalarbeit von Joshua Wiley, http://r.789695.n4.nabble.com/Install-package-automatically-if-not-there-td2267532.html
Beispiel:
PS:
update.packages(ask = FALSE)
&biocLite(character(), ask=FALSE)
aktualisiert alle auf dem System installierten Pakete. Dies kann lange dauern und gilt als vollständiges R-Upgrade, für das möglicherweise nicht immer eine Garantie besteht!quelle
loadpack()
unter raw.githubusercontent.com/holgerbrandl/datautils/master/R/…Sie können die
setdiff
Funktion einfach verwenden , um die nicht installierten Pakete abzurufen und anschließend zu installieren. Im folgenden Beispiel prüfen wir, ob die Paketeggplot2
undRcpp
installiert sind, bevor Sie sie installieren.In einer Zeile kann das Obige geschrieben werden als:
quelle
installed.packages()[,'Package']
anstelle von verwendenrownames(installed.packages())
.Ich habe die Funktion implementiert, um erforderliche R-Pakete still zu installieren und zu laden. Hoffnung könnte helfen. Hier ist der Code:
quelle
Die kommende Version von RStudio (1.2), die bereits als Vorschau verfügbar ist, enthält eine Funktion zum Erkennen fehlender Pakete
library()
undrequire()
Aufrufe und zum Auffordern des Benutzers, diese zu installieren:Dies scheint das ursprüngliche Anliegen von OP besonders gut anzusprechen:
quelle
In Bezug auf Ihr Hauptziel "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. Es wird versucht, das benannte Paket "x" zu laden und zu überprüfen. Wenn es nicht installiert ist, installieren Sie es direkt einschließlich der Abhängigkeiten. und zuletzt normal laden. Sie benennen den Funktionsnamen von 'require' in 'library' um, um die Integrität aufrechtzuerhalten. Die einzige Einschränkung besteht darin, dass Paketnamen in Anführungszeichen gesetzt werden sollten.
So können Sie das Paket auf die altmodische Weise von R laden und installieren. Require ("ggplot2") require ("Rcpp")
quelle
delete
Link über diesen Kommentaren sehen. Wenn Sie dies nicht tun und dennoch löschen möchten, verwenden Sie denflag
Link, wählen Sie "Andere" aus und erklären Sie einem Moderator, dass die Antwort entfernt werden soll.Ganz einfach.
quelle
Ich dachte, ich würde den Beitrag leisten, den ich benutze:
quelle
quelle
Mit lapply family und anonymem Funktionsansatz können Sie:
||
Lazy Evaluation).Drucken Sie den endgültigen Ladestatus jedes Pakets aus (
TRUE
/FALSE
).quelle
Ich verwende Folgendes, um zu überprüfen, ob das Paket installiert ist und ob Abhängigkeiten aktualisiert werden, und lade dann das Paket.
quelle
Hier ist mein Code dafür:
quelle
quelle
Dies funktioniert mit nicht zitierten Paketnamen und ist ziemlich elegant (vgl. GeoObserver-Antwort)
quelle
In meinem Fall wollte ich einen Einzeiler, den ich über die Befehlszeile ausführen kann (tatsächlich über ein Makefile). Hier ist ein Beispiel für die Installation von "VGAM" und "Feder", falls diese noch nicht installiert sind:
Aus R heraus wäre es nur:
Es gibt hier nichts außer den vorherigen Lösungen außer dem:
repos
Parameter (um zu vermeiden, dass Popups nach dem zu verwendenden Spiegel fragen)Beachten Sie auch das Wichtige
character.only=TRUE
(ohne esrequire
würde das versuchen, das Paket zu ladenp
).quelle
quelle
Lassen Sie mich ein bisschen Wahnsinn teilen:
quelle