Das Handbuch " Schreiben von R-Erweiterungen " enthält die folgenden Anleitungen zur Verwendung von Importen oder Abhängigkeiten:
Die allgemeinen Regeln sind
- Pakete, deren Namespace nur zum Laden des Pakets mithilfe der Bibliothek (pkgname) benötigt wird, müssen im Feld "Importe" und nicht im Feld "Abhängig" aufgeführt werden.
- Pakete, die angehängt werden müssen, um das Paket mithilfe der Bibliothek (pkgname) erfolgreich zu laden, dürfen nur im Feld "Abhängig" aufgeführt werden.
Kann jemand etwas mehr Klarheit darüber schaffen? Woher weiß ich, wann für mein Paket nur Namespaces geladen werden müssen und wann ein Paket angehängt werden muss? Was sind Beispiele für beides? Ich denke, das typische Paket ist nur eine Sammlung von Funktionen, die manchmal Funktionen in anderen Paketen aufrufen (wo ein Teil der Arbeit bereits codiert wurde). Ist dieses Szenario 1 oder 2 oben?
Bearbeiten
Ich habe einen Blog-Beitrag mit einem Abschnitt zu diesem speziellen Thema geschrieben (Suche nach "Imports v Depends"). Die Grafiken erleichtern das Verständnis.
Antworten:
"Imports"
ist sicherer als"Depends"
(und macht ein Paket, das es verwendet, auch zu einem "besseren Bürger" im Vergleich zu anderen Paketen, die es verwenden"Depends"
).Eine
"Depends"
Direktive versucht sicherzustellen, dass eine Funktion aus einem anderen Paket verfügbar ist, indem das andere Paket an den Hauptsuchpfad angehängt wird (dh die Liste der von zurückgegebenen Umgebungensearch()
). Diese Strategie kann jedoch vereitelt werden, wenn ein anderes Paket, das später geladen wird, eine identisch benannte Funktion früher in den Suchpfad einfügt. Chambers ( in Soda ) verwendet das Beispiel der Funktion"gam"
, die sowohl in der festgestellt wird ,gam
undmgcv
Pakete. Wenn zwei andere Pakete geladen würden, eines davon abhängig vongam
und eines davon abhängigmgcv
, würde die durch Aufrufe an gefundene Funktion vongam()
der Reihenfolge abhängen, in der diese beiden Pakete angehängt wurden. Nicht gut.Eine
"Imports"
Direktive sollte für jedes unterstützende Paket verwendet werden, dessen Funktionen in<imports:packageName>
(unmittelbar danach gesucht<namespace:packageName>
) platziert werden sollen, anstatt auf dem regulären Suchpfad. Wenn eines der Pakete im obigen Beispiel den"Imports"
Mechanismus verwendet (der auch Anweisungenimport
oderimportFrom
Anweisungen in derNAMESPACE
Datei erfordert ), würde dies auf zwei Arten verbessert. (1) Das Paket würde selbst die Kontrolle darüber erlangen, welchemgcv
Funktion verwendet wird. (2) Wenn der Hauptsuchpfad von den importierten Objekten ferngehalten wird, wird möglicherweise nicht einmal die Abhängigkeit des anderen Pakets von der anderenmgcv
Funktion aufgehoben.Aus diesem Grund ist die Verwendung von Namespaces eine so gute Vorgehensweise, warum sie jetzt von CRAN erzwungen wird und (insbesondere) warum die Verwendung
"Imports"
sicherer ist als die Verwendung"Depends"
.Bearbeitet, um eine wichtige Einschränkung hinzuzufügen:
Es ist eine leider gemeinsame Ausnahme von der Beratung über: wenn Ihr Paket auf ein Paket basiert ,
A
die sich"Depends"
auf ein anderes PaketB
, das Paket wahrscheinlich benötigen anhängenA
mit einer"Depends
Richtlinie.Dies liegt daran, dass die Funktionen im Paket
A
mit der Erwartung geschrieben wurden, dass das PaketB
und seine Funktionen an densearch()
Pfad angehängt werden .Eine
"Depends"
Direktive lädt ein Paket und hängt esA
an. Zu diesem Zeitpunkt bewirkt dieA
eigene"Depends"
Direktive des Pakets in einer Kettenreaktion, dass das Paket ebenfallsB
geladen und angehängt wird. Funktionen im PaketA
können dann die Funktionen im Paket finden,B
auf die sie sich verlassen.Eine
"Imports"
Richtlinie wird geladen , aber nicht Paket anhängenA
und wird weder Last noch Paket anhängenB
. ("Imports"
Immerhin erwartet , dass Paket Autoren des Namespace - Mechanismus verwenden, und dieses PaketA
wird mit sein"Imports"
auf alle Funktionen zu Punkt ,B
dass sie den Zugang zu müssen.) Anrufe durch Ihre Funktionen auf alle Funktionen im Paket ,A
die auf Funktionen im Paket verlassenB
Willen folglich scheitern.Die einzigen zwei Lösungen sind entweder:
A
mithilfe einer"Depends"
Anweisung anhängen .A
und bitten Sie ihn, den Namespace sorgfältiger zu erstellen (in den Worten von Martin Morgan in dieser Antwort ).quelle
Imports
undDepends
WRT Version Anforderungen und Prüfung von Beispielen in.Rd
Dateien sind in der Tat subtil und es lohnt sich zu wissen.Imports: ggplot2
, warum mein Paket dann dieautoplot
Funktion nicht findet . OffensichtlichDepends
hängt die Paketbibliothek vonggplot2
und so gibt es kein Problem. zB Ich habe eine Funktion,autoplot.myFunction()
die das@import ggplot2
Tag verwendet und mein Paket hat,Imports: ggplot2
aber ich erhalte eine Fehlermeldung:Error in eval(expr, envir, enclos) : could not find function "autoplot"
Wenn ich versuche, es zu verwenden.Depends
undImports
Abschnitte von formulierteDESCRIPTION
, wirklich fragte, was "Importieren" einer Funktion (anstatt "davon abhängig" zu sein) bedeutet. Da letzteres die Frage ist, die ich zu beantworten versucht habe (und - ich vermute - was die meisten Leute, die diese Antwort suchen, wissen wollen), werde ich die Antwort ansonsten unverändert lassen.Hadley Wickham gibt eine einfache Erklärung ( http://r-pkgs.had.co.nz/namespace.html ):
quelle
Chambers in SfDA sagt, dass "Importe" verwendet werden sollen, wenn dieses Paket einen "Namespace" -Mechanismus verwendet. Da alle Pakete jetzt über diese verfügen müssen, lautet die Antwort möglicherweise immer "Importe". In der Vergangenheit konnten Pakete ohne Namespaces geladen werden, und in diesem Fall müssten Sie Depends verwendet haben.
quelle
<namespace:packageName>
, als Teil von durchsucht<imports:packageName>
. Eslibrary()
ist kein weiterer Aufruf von erforderlich, und R benachrichtigt Sie beim Laden desImport
Pakets nicht an der Konsole, es sei denn, das ed-Paket kann nicht gefunden werden.Hier ist eine einfache Frage, die Ihnen bei der Entscheidung hilft, welche Sie verwenden möchten:
Erfordert Ihr Paket, dass der Endbenutzer direkten Zugriff auf die Funktionen eines anderen Pakets hat?
Sie sollten "Abhängig" nur verwenden, wenn Ihr Paket ein Add-On oder ein Begleiter zu einem anderen Paket ist, bei dem Ihr Endbenutzer Funktionen sowohl aus Ihrem Paket als auch aus dem Paket "Abhängig" in seinem Code verwendet. Wenn Ihr Endbenutzer nur mit Ihren Funktionen verbunden ist und das andere Paket nur hinter den Kulissen arbeitet, verwenden Sie stattdessen "Importe".
Die Einschränkung besteht darin, dass Ihr Code, wenn Sie 'Imports' wie gewohnt ein Paket hinzufügen, auf Funktionen aus diesem Paket verweisen muss, wobei die vollständige Namespace-Syntax verwendet wird, z. B.
dplyr::mutate()
statt nurmutate()
. Es macht den Code etwas umständlicher zu lesen, aber es ist ein kleiner Preis für eine bessere Verpackungshygiene.quelle