"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 Umgebungen search()
). 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
und mgcv
Pakete. Wenn zwei andere Pakete geladen würden, eines davon abhängig von gam
und eines davon abhängig mgcv
, würde die durch Aufrufe an gefundene Funktion von gam()
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 Anweisungen import
oder importFrom
Anweisungen in der NAMESPACE
Datei erfordert ), würde dies auf zwei Arten verbessert. (1) Das Paket würde selbst die Kontrolle darüber erlangen, welche mgcv
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 anderen mgcv
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 Paket B
, das Paket wahrscheinlich benötigen anhängen A
mit einer "Depends
Richtlinie.
Dies liegt daran, dass die Funktionen im Paket A
mit der Erwartung geschrieben wurden, dass das Paket B
und seine Funktionen an den search()
Pfad angehängt werden .
Eine "Depends"
Direktive lädt ein Paket und hängt es A
an. Zu diesem Zeitpunkt bewirkt die A
eigene "Depends"
Direktive des Pakets in einer Kettenreaktion, dass das Paket ebenfalls B
geladen und angehängt wird. Funktionen im Paket A
können dann die Funktionen im Paket finden, B
auf die sie sich verlassen.
Eine "Imports"
Richtlinie wird geladen , aber nicht Paket anhängen A
und wird weder Last noch Paket anhängen B
. ( "Imports"
Immerhin erwartet , dass Paket Autoren des Namespace - Mechanismus verwenden, und dieses Paket A
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 verlassen B
Willen folglich scheitern.
Die einzigen zwei Lösungen sind entweder:
- Lassen Sie Ihr Paket das Paket
A
mithilfe einer "Depends"
Anweisung anhängen .
- Wenden Sie sich auf lange Sicht besser an den Paketbetreuer
A
und bitten Sie ihn, den Namespace sorgfältiger zu erstellen (in den Worten von Martin Morgan in dieser Antwort ).