TL;DR können Sie verwenden find.package()
für diese.
Fast alle Antworten beruhen entweder auf (1) require()
oder (2) installed.packages()
um zu prüfen, ob ein bestimmtes Paket bereits installiert ist oder nicht.
Ich füge eine Antwort hinzu, weil diese für einen leichtgewichtigen Ansatz zur Beantwortung dieser Frage nicht zufriedenstellend sind.
require
hat den Nebeneffekt, dass der Namespace des Pakets geladen wird, was nicht immer erwünscht sein mag
installed.packages
ist eine Bazooka, um eine Kerze anzuzünden - sie wird die das Universum der installierten Pakete, dann prüfen wir, ob unser(e) Paket(e) in dieser Bibliothek "vorrätig" sind. Es ist nicht nötig, einen Heuhaufen zu bauen, nur um eine Nadel zu finden.
Diese Antwort wurde auch inspiriert durch Die großartige Antwort von @ArtemKlevtsov in ähnlichem Sinne zu einer duplizierten Version dieser Frage. Er stellte fest, dass system.file(package=x)
kann die gewünschte Wirkung haben, nämlich die Rückkehr ''
wenn das Paket nicht installiert ist, und etwas mit nchar > 1
sonst.
Wenn wir unter die Haube schauen, wie system.file
dies erreicht, können wir sehen, dass es eine andere base
Funktion, find.package
die wir direkt verwenden können:
# a package that exists
find.package('data.table', quiet=TRUE)
# [1] "/Library/Frameworks/R.framework/Versions/4.0/Resources/library/data.table"
# a package that does not
find.package('InstantaneousWorldPeace', quiet=TRUE)
# character(0)
Wir können auch einen Blick unter die Haube werfen find.package
um zu sehen, wie es funktioniert, aber das ist hauptsächlich eine lehrreiche Übung - die einzige Möglichkeit, die Funktion zu verschlanken, die ich sehe, wäre, einige Robustheitsüberprüfungen zu überspringen. Aber die Grundidee ist: Schau in .libPaths()
-- jedes installierte Paket pkg
haben eine DESCRIPTION
Datei unter file.path(.libPaths(), pkg)
Eine schnelle und einfache Prüfung ist also file.exists(file.path(.libPaths(), pkg, 'DESCRIPTION')
.
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.
2 Stimmen
@BrianDiggs: Das Bootstrapping dieses Installationsprüfungspakets ist ein notwendiges Ärgernis, aber ein kleines. Es sei denn, natürlich, die Funktionalität findet ihren Weg in
base
... ;-)1 Stimmen
Wenn man von Node.js kommt, ist es wahnsinnig, wie schwer das ist. Wie ist dies nicht eine erstklassige Funktion der Sprache?