"Imports"
es más seguro que "Depends"
(y también hace que un paquete lo use como un "mejor ciudadano" con respecto a otros paquetes que sí lo usan "Depends"
).
Una directiva "Depends"
intenta asegurar que una función de otro paquete esté disponible adjuntando el otro paquete a la ruta de búsqueda principal (es decir, la lista de entornos devueltos por search()
). Sin embargo, esta estrategia se puede ver frustrada si otro paquete, cargado más tarde, coloca una función nombrada de manera idéntica anteriormente en la ruta de búsqueda. Chambers() utiliza el ejemplo de la función "gam"
, que se encuentra en los paquetes gam
y mgcv
. Si se cargaron otros dos paquetes, uno de ellos según gam
y otro que depende de mgcv
, la función encontrada por las llamadas a gam()
dependerá del orden en que se adjuntaron esos dos paquetes. No está bien.
Un "Imports"
Directiva coloca el paquete importado en <imports:packageName>
(búsqueda inmediatamente después de <namespace:packageName>
), en lugar de en el camino de búsqueda normal. Si cualquiera de los paquetes en el ejemplo anterior utilizó el mecanismo "Imports"
, los asuntos se mejorarían de dos maneras. (1) El paquete obtendría el control sobre la función mgcv
que se usa. (2) Al mantener la ruta de búsqueda principal libre de objetos importados, ni siquiera podría potencialmente romper la dependencia del otro paquete en la otra función mgcv
.
Es por eso que usar espacios de nombres es una buena práctica, por qué ahora es implementado por CRAN, y (en particular) por qué usar "Imports"
es más seguro que usar "Depends"
.
Editado para agregar una importante advertencia:
Hay uno excepción lamentablemente común a los consejos anteriores: si su paquete se basa en un paquete A
que a su vez "Depends"
de otro paquete B
, su Es probable que el paquete necesite adjuntar A
con una directiva "Depends
.
Esto se debe a las funciones en el paquete A
fueron escritos con la expectativa de que el paquete B
y sus funciones se unirían a la rutasearch()
.
A "Depends"
directiva se cargará y adjuntar empaquetar A
, momento en el paquete A
's propio "Depends"
Directiva, en una reacción en cadena, causa paquete B
a ser cargado y unido también. Las funciones del paquete A
podrán encontrar las funciones en el paquete B
del que dependen.
Un "Imports"
Directiva se carga pero no adjuntar paquete A
y se ni carga ni adjuntar paquete B
. ("Imports"
, después de todo, espera que los escritores de paquetes estén usando el mecanismo de espacio de nombres, y que el paquete A
utilizará "Imports"
para señalar cualquier función en B
a la que necesite acceder). Llamadas por sus funciones a cualquier función del paquete A
que dependa en funciones en el paquete B
fallará en consecuencia.
Las dos únicas soluciones son o bien:
- Tener su paquete adjuntar paquete
A
utilizando una directiva "Depends"
.
- mejor en el largo plazo, en contacto con el mantenedor del paquete
A
y pedirles que hagan un trabajo más cuidadoso de la construcción de su espacio de nombres (en palabras de Martin Morgan en this related answer).
Su entrada en el blog me ha dicho todo sobre la estructura del paquete, cuando yo empecé a planear [* * módulos] (https://github.com/klmr/modules). ¡Gracias! –