"Imports"
jest bezpieczniejszy niż "Depends"
(a także sprawia, że korzystający z niego pakiet jest „lepszym obywatelem” w stosunku do innych pakietów, które go używają "Depends"
).
A "Depends"
dyrektywa próby w celu zapewnienia, że funkcja z innego pakietu jest dostępna dołączając drugą paczkę do głównej ścieżce wyszukiwania (czyli listę środowisk zwróconych przez search()
). Ta strategia może jednak zostać udaremniona, jeśli inny pakiet załadowany później umieści identycznie nazwaną funkcję wcześniej na ścieżce wyszukiwania. Chambers ( w SoDA ) używa przykładu funkcji "gam"
, który znajduje się zarówno w pakiecie , jak gam
i mgcv
. Gdyby załadowano dwa inne pakiety, jeden z nich zależny, gam
a drugi zależny od mgcv
, funkcja znaleziona przez wywołania gam()
zależałaby od kolejności, w jakiej te dwa pakiety zostały dołączone. Niedobrze.
"Imports"
Dyrektywa powinna być stosowana dla każdego pakietu wspierającego, którego funkcje mają być umieszczone w <imports:packageName>
(poszukiwanej natychmiast po <namespace:packageName>
), zamiast na zwykłej ścieżce wyszukiwania. Gdyby któryś z pakietów w powyższym przykładzie używał "Imports"
mechanizmu (który również wymaga import
lub importFrom
dyrektyw w NAMESPACE
pliku), sytuacja uległaby poprawie na dwa sposoby. (1) Pakiet sam zyskałby kontrolę nad mgcv
używaną funkcją. (2) Utrzymując główną ścieżkę wyszukiwania z dala od importowanych obiektów, nie spowodowałoby to nawet potencjalnego zerwania zależności innego pakietu od innej mgcv
funkcji.
Dlatego używanie przestrzeni nazw jest tak dobrą praktyką, dlatego jest obecnie wymuszane przez CRAN i (w szczególności), dlaczego używanie "Imports"
jest bezpieczniejsze niż używanie "Depends"
.
Zmieniono, aby dodać ważne zastrzeżenie:
Jest jeden niestety powszechne wyjątkiem rad powyżej: jeśli pakiet opiera się na pakiet A
, który sam "Depends"
na inny pakiet B
, pakiet będzie prawdopodobnie musiał dołączyć A
z "Depends
dyrektywą.
Dzieje się tak, ponieważ funkcje w pakiecie A
zostały napisane z oczekiwaniem, że pakiet B
i jego funkcje zostaną dołączone do search()
ścieżki .
"Depends"
Dyrektywy ładuje i dołączać pakiet A
, w którym to momencie pakiet A
jest własny "Depends"
Dyrektywa będzie w reakcji łańcuchowej pakiet przyczyną B
być ładowane i dołączony również. Funkcje w pakiecie A
będą wtedy mogły znaleźć funkcje w pakiecie, B
na których polegają.
"Imports"
Dyrektywa będzie ładować, ale nie przywiązują pakiet A
i będzie ani obciążenia ani dołączyć pakiet B
. ( "Imports"
Mimo wszystko oczekuje, że autorzy pakietów korzysta mechanizm przestrzeni nazw, a pakiet A
będzie używał "Imports"
do punktu do jakichkolwiek funkcji w B
które potrzebują to dostęp.) Połączeń telefonicznych funkcji do jakichkolwiek funkcji w pakiecie A
, które opierają się na funkcjach w opakowaniu B
woli w konsekwencji zawiedzie.
Jedyne dwa rozwiązania to:
- Niech twój pakiet dołączy pakiet
A
za pomocą "Depends"
dyrektywy.
- Lepiej na dłuższą metę, skontaktuj się z opiekunem pakietu
A
i poproś go, aby wykonał bardziej ostrożną pracę przy konstruowaniu ich przestrzeni nazw (słowami Martina Morgana w tej powiązanej odpowiedzi ).