"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 gam
et mgcv
. Si deux autres packages étaient chargés, l'un d'eux dépendant de gam
et 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 import
ou des importFrom
directives dans le NAMESPACE
fichier), les choses seraient améliorées de deux manières. (1) Le package prendrait lui-même le contrôle de la mgcv
fonction 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 mgcv
fonction.
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 A
qui lui-même "Depends"
sur un autre paquet B
, votre paquet devra probablement être attaché A
avec une "Depends
directive.
Cela est dû au fait que les fonctions du package A
ont été écrites dans l'espoir que le package B
et ses fonctions seraient attachés au search()
chemin .
Une "Depends"
directive chargera et attachera le package A
, à quel point A
la 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 A
pourront alors trouver les fonctions du package B
sur lesquelles elles reposent.
Une "Imports"
directive chargera mais n'attachera pas le package A
et 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 A
utilisera "Imports"
pour pointer vers toutes les fonctions B
auxquelles il a besoin d'accéder.) Les appels par vos fonctions à toutes les fonctions du package A
qui reposent sur des fonctions du package B
seront par conséquent échouer.
Les deux seules solutions sont soit:
- Demandez à votre package de joindre le package à l'
A
aide d'une "Depends"
directive.
- Mieux vaut à long terme, contactez le responsable du package
A
et 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 ).