"Imports"
est plus sûr que d' "Depends"
(et aussi fait un paquet en utilisant un meilleur citoyen " à l'égard d'autres paquets qui utilisent "Depends"
).
Un "Depends"
directive vise à assurer qu'une fonction à partir d'un autre package est disponible en attachant l'autre package pour le principal chemin de recherche (c'est à dire la liste des environnements retourné par search()
). Cette stratégie peut, cependant, être contrecarrée si un autre paquet, chargé plus tard, des lieux un nom identique en fonction plus tôt sur le chemin de recherche. Les chambres (de Soude) utilise l'exemple de la fonction "gam"
, ce qui est trouvé dans les deux gam
et mgcv
des paquets. Si les deux autres paquets ont été chargés, l'un d'entre eux, selon gam
et un en mgcv
, la fonction trouvée par des appels d' gam()
dépendrait de l'ordre dans lequel ils ces deux paquets étaient attachés. Pas bonne.
Un "Imports"
directive met le package importé en <imports:packageName>
(recherchés immédiatement après l' <namespace:packageName>
), plutôt que sur la recherche régulière de chemin. Si l'un des paquets dans l'exemple ci-dessus utilisé l' "Imports"
mécanisme, les choses seraient améliorée de deux façons. (1) Le colis serait lui-même d'en prendre le contrôle, qui mgcv
fonction est utilisée. (2) En maintenant la recherche principale chemin clair d'objets importés, il ne serait pas même potentiellement briser l'autre paquet de dépendance sur les autres mgcv
fonction.
C'est pourquoi l'utilisation des espaces de noms est une bonne pratique, pourquoi il est maintenant assurée par CRAN, et (en particulier) pourquoi l'utilisation d' "Imports"
est plus sûr que d'utiliser "Depends"
.
Edité pour ajouter une mise en garde importante:
Il y a un malheureusement commun exception pour les conseils ci-dessus: si votre colis s'appuie sur un paquet A
qui lui-même "Depends"
sur un autre paquet, B
, votre colis sera probablement besoin de joindre A
avec un "Depends
directive.
C'est parce que les fonctions du package A
ont été écrits avec l'espoir que le paquet B
et de ses fonctions seraient attachées à l' search()
chemin.
Un "Depends"
directive de la charge et de joindre paquet A
, à quel point colis A
' "Depends"
directive, dans une réaction en chaîne, à cause de package B
de chargement et de joint. Fonctions dans le paquet A
sera alors en mesure de trouver les fonctions dans le paquet B
sur laquelle ils s'appuient.
Un "Imports"
directive de charge mais pas de joindre paquet A
et ni charge ni attacher paquet B
. ("Imports"
, après tout, s'attend à ce que le paquet écrivains sont en utilisant le mécanisme d'espace de noms, et que ce paquet A
sera à l'aide de "Imports"
de point à toutes les fonctions en B
qu'ils ont besoin de l'accès à l'.) Les appels de par vos fonctions toutes les fonctions dans le paquet A
qui s'appuient sur des fonctions dans le paquet B
sera, par conséquent, l'échec.
Les deux seules solutions sont:
- Votre package joindre paquet
A
à l'aide d'un "Depends"
directive.
- Mieux dans le long terme, contacter le mainteneur du paquet
A
et leur demander de faire un travail plus attentif de la construction de leur espace de noms (dans les mots de Martin Morgan dans cette réponse).