"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 , gamund mgcvPakete. Wenn zwei andere Pakete geladen würden, eines davon abhängig von gamund 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 importoder importFromAnweisungen in der NAMESPACEDatei erfordert ), würde dies auf zwei Arten verbessert. (1) Das Paket würde selbst die Kontrolle darüber erlangen, welche mgcvFunktion 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 mgcvFunktion 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 , Adie sich "Depends"auf ein anderes Paket B, das Paket wahrscheinlich benötigen anhängen Amit einer "DependsRichtlinie.
Dies liegt daran, dass die Funktionen im Paket Amit der Erwartung geschrieben wurden, dass das Paket Bund seine Funktionen an den search()Pfad angehängt werden .
Eine "Depends"Direktive lädt ein Paket und hängt es Aan. Zu diesem Zeitpunkt bewirkt die Aeigene "Depends"Direktive des Pakets in einer Kettenreaktion, dass das Paket ebenfalls Bgeladen und angehängt wird. Funktionen im Paket Akönnen dann die Funktionen im Paket finden, Bauf die sie sich verlassen.
Eine "Imports"Richtlinie wird geladen , aber nicht Paket anhängen Aund wird weder Last noch Paket anhängen B. ( "Imports"Immerhin erwartet , dass Paket Autoren des Namespace - Mechanismus verwenden, und dieses Paket Awird mit sein "Imports"auf alle Funktionen zu Punkt , Bdass sie den Zugang zu müssen.) Anrufe durch Ihre Funktionen auf alle Funktionen im Paket , Adie auf Funktionen im Paket verlassen BWillen folglich scheitern.
Die einzigen zwei Lösungen sind entweder:
- Lassen Sie Ihr Paket das Paket
Amithilfe einer "Depends"Anweisung anhängen .
- Wenden Sie sich auf lange Sicht besser an den Paketbetreuer
Aund bitten Sie ihn, den Namespace sorgfältiger zu erstellen (in den Worten von Martin Morgan in dieser Antwort ).