177 votes

Meilleure explication à suivre pour utiliser Imports/cela dépend

"L'Écriture d'Extensions de R" manuel fournit des instructions détaillées sur l'utilisation des Importations ou Dépend:

Les règles générales sont

  • Les paquets dont les noms seulement est nécessaire pour charger le package à l'aide de la bibliothèque(pkgname) doivent être inscrites dans les "Importations" terrain et pas dans les ‘Dépend' de champ.
  • Les paquets qui doivent être fixés pour réussir à charger le package à l'aide de la bibliothèque(pkgname) doivent être mentionnées dans le ‘Dépend' de champ, seulement.

Quelqu'un peut-il fournir un peu plus clairty sur ce point? Comment puis-je savoir quand mon colis seulement les besoins en espaces de noms chargé par rapport à quand j'ai besoin d'un paquet à être attaché? Ce sont des exemples des deux? Je pense que le typique package est juste une collection de fonctions qui parfois appeler des fonctions dans d'autres packages (où certains peu de travail a déjà été codé). Ce scénario est-il 1 ou 2 ci-dessus?

Modifier

J'ai écrit un billet de blog avec un article sur ce sujet en particulier (recherche pour "les Importations v Dépend'). Les visuels rendent beaucoup plus facile à comprendre.

163voto

Josh O'Brien Points 68397

"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:

  1. Votre package joindre paquet A à l'aide d'un "Depends" directive.
  2. 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).

16voto

BondedDust Points 105234

Chambres à la SfDA dit utiliser « Imports » quand ce paquet utilise un mécanisme de « namespace » et étant donné que tous les colis doivent maintenant de les faire, alors la réponse est peut-être maintenant toujours « Imports ». Dans les derniers paquets aurait pu être chargés sans réellement avoir des espaces de noms et dans ce cas, vous devrez avoir utilisé cela dépend.

0voto

Karl Forner Points 1565

S’il vous plaît jeter un oeil à mon blog : http://r2d2.quartzbio.com/posts/package-depends-dirty-hack-solution.html j’ai une solution plus propre à venir, toujours avoir à l’écrire vers le bas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X