"Imports"est plus sûr que "Depends"(et fait également d'un paquet qui l'utilise un «meilleur citoyen» par rapport aux autres paquets qui l'utilisent "Depends").
Une "Depends"directive tente de garantir qu'une fonction d'un autre package est disponible en attachant l'autre package au chemin de recherche principal (c'est-à-dire à la liste des environnements renvoyés par search()). Cette stratégie peut cependant être contrecarrée si un autre package, chargé plus tard, place une fonction de nom identique plus tôt sur le chemin de recherche. Chambers ( dans SoDA ) utilise l'exemple de la fonction "gam", qui se trouve à la fois dans les packages gamet mgcv. Si deux autres packages étaient chargés, l'un d'eux dépendant de gamet l'autre dépendant de mgcv, la fonction trouvée par les appels à gam()dépendrait de l'ordre dans lequel ces deux packages étaient attachés. Pas bon.
Une "Imports"directive doit être utilisée pour tout package de support dont les fonctions doivent être placées <imports:packageName>(recherchées immédiatement après <namespace:packageName>), au lieu de sur le chemin de recherche normal. Si l'un des packages de l'exemple ci-dessus utilisait le "Imports"mécanisme (qui requiert également importou des importFromdirectives dans le NAMESPACEfichier), les choses seraient améliorées de deux manières. (1) Le package prendrait lui-même le contrôle de la mgcvfonction utilisée. (2) En gardant le chemin de recherche principal dégagé des objets importés, cela ne casserait même pas potentiellement la dépendance de l'autre paquet sur l'autre mgcvfonction.
C'est pourquoi l'utilisation d'espaces de noms est une si bonne pratique, pourquoi elle est désormais appliquée par CRAN, et (en particulier) pourquoi l'utilisation "Imports"est plus sûre que l'utilisation "Depends".
Modifié pour ajouter une mise en garde importante:
Il y a une exception malheureusement courante au conseil ci-dessus: si votre paquet repose sur un paquet Aqui lui-même "Depends"sur un autre paquet B, votre paquet devra probablement être attaché Aavec une "Dependsdirective.
Cela est dû au fait que les fonctions du package Aont été écrites dans l'espoir que le package Bet ses fonctions seraient attachés au search()chemin .
Une "Depends"directive chargera et attachera le package A, à quel point Ala propre "Depends"directive du package provoquera, dans une réaction en chaîne, le chargement et l'attachement du package B. Les fonctions du package Apourront alors trouver les fonctions du package Bsur lesquelles elles reposent.
Une "Imports"directive chargera mais n'attachera pas le package Aet ne chargera ni n'attachera le package B. ( "Imports"après tout, s'attend à ce que les auteurs de packages utilisent le mécanisme d'espace de noms, et que ce package Autilisera "Imports"pour pointer vers toutes les fonctions Bauxquelles il a besoin d'accéder.) Les appels par vos fonctions à toutes les fonctions du package Aqui reposent sur des fonctions du package Bseront par conséquent échouer.
Les deux seules solutions sont soit:
- Demandez à votre package de joindre le package à l'
Aaide d'une "Depends"directive.
- Mieux vaut à long terme, contactez le responsable du package
Aet demandez-lui de faire un travail plus soigneux de construction de son espace de noms (selon les mots de Martin Morgan dans cette réponse connexe ).