"Imports"
jest bezpieczniejsza niż "Depends"
(a także sprawia, że pakiet używa go "lepszego obywatela" w odniesieniu do innych pakietów, które używają "Depends"
).
Dyrektywa "Depends"
próbuje zapewnić, że funkcja z innego pakietu jest dostępna przez dołączenie innego pakietu do głównej ścieżki wyszukiwania (tj. Listy środowisk zwróconych przez search()
). Tej strategii można jednak zapobiec, jeśli inny pakiet, załadowany później, umieszcza identycznie nazwaną funkcję wcześniej na ścieżce wyszukiwania. Komora() wykorzystuje przykład funkcji "gam"
, która znajduje się zarówno w paczkach gam
, jak i. Jeśli załadowano dwa inne pakiety, jeden z nich w zależności od gam
i jeden zależny od mgcv
, funkcja znaleziona przez wywołania gam()
zależy od kolejności, w jakiej te dwa pakiety zostały dołączone. Niedobrze.
dyrektywę "Imports"
umieszcza importowaną pakiet w <imports:packageName>
(wyszukane natychmiast po <namespace:packageName>
), zamiast na zwykłej ścieżce wyszukiwania. Jeśli którykolwiek z pakietów w powyższym przykładzie użyłby mechanizmu "Imports"
, sprawy zostałyby poprawione na dwa sposoby. (1) Pakiet sam uzyskałby kontrolę nad funkcją mgcv
. (2) Utrzymując główną ścieżkę wyszukiwania z importowanych obiektów, nie mógłby potencjalnie złamać zależności drugiego pakietu od innej funkcji mgcv
.
Dlatego używanie przestrzeni nazw jest tak dobrą praktyką, dlaczego jest teraz wymuszana przez CRAN i (w szczególności), dlaczego używanie "Imports"
jest bezpieczniejsze niż używanie "Depends"
.
Edited by dodać ważną zastrzeżenie:
Jest jeden niestety powszechne wyjątkiem rad powyżej: jeśli pakiet opiera się na opakowaniu A
która sama "Depends"
na innym opakowaniu B
, twój pakiet prawdopodobnie będzie wymagał dołączenia A
z dyrektywą "Depends
.
To dlatego funkcje w pakiecie A
zostały napisane z oczekiwaniem, że pakiet B
i jego funkcje zostaną dołączone do ścieżkisearch()
.
Dyrektywa "Depends"
ładuje i dołączać pakiet A
, w tym momencie pakiet A
„własnym dyrektywy "Depends"
się 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ą.
dyrektywę "Imports"
załaduje ale nie dołączyć pakiet A
i ani obciążenie ani dołączyć pakiet B
. ("Imports"
, mimo wszystko, oczekuje, że twórcy pakietów używają mechanizmu przestrzeni nazw, i że pakiet A
będzie używał "Imports"
do wskazywania dowolnej funkcji w B
, że potrzebuje dostępu.) Połączenia przez twoje funkcje z dowolnymi funkcjami w pakiecie A
, które polegają na na funkcjach w pakiecie B
w konsekwencji nie powiedzie się.
tylko dwa rozwiązania są albo:
- Mają swój pakiet dołączyć pakiet
A
stosując dyrektywę "Depends"
.
- Lepiej w dłuższej perspektywie, skontaktuj się z opiekunem pakietu
A
i poproś go o wykonanie bardziej uważnej pracy nad stworzeniem ich przestrzeni nazw (według słów Martina Morgana w this related answer).
Twoim blogu powiedział mi wszystko o strukturze pakietu, z powrotem, gdy zacząłem planuje [* moduły *] (https://github.com/klmr/modules). Dzięki! –