"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 "Depends"
directiva 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 frustrar si otro paquete, cargado más tarde, coloca una función con un nombre idéntico anteriormente en la ruta de búsqueda. Chambers ( en SoDA ) 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 los cuales depende gam
y el otro depende de mgcv
, la función encontrada por las llamadas a gam()
dependería del orden en que se adjuntaron esos dos paquetes. No está bien.
Se "Imports"
debe usar una directiva para cualquier paquete de soporte cuyas funciones se deben colocar <imports:packageName>
(buscar inmediatamente después <namespace:packageName>
), en lugar de en la ruta de búsqueda normal. Si cualquiera de los paquetes en el ejemplo anterior usara el "Imports"
mecanismo (que también requiere import
o importFrom
directivas en el NAMESPACE
archivo), las cosas mejorarían de dos maneras. (1) El paquete en sí mismo obtendría el control sobre qué mgcv
función se utiliza. (2) Al mantener la ruta de búsqueda principal libre de los objetos importados, ni siquiera rompería la dependencia del otro paquete de la otra mgcv
función.
Esta es la razón por la cual el uso de espacios de nombres es una buena práctica, por qué ahora CRAN lo aplica y (en particular) por qué usar "Imports"
es más seguro que usarlo "Depends"
.
Editado para agregar una advertencia importante:
Desafortunadamente, hay una excepción común a los consejos anteriores: si su paquete se basa en un paquete A
que se encuentra "Depends"
en otro paquete B
, es probable que deba adjuntarlo A
con una "Depends
directiva.
Esto se debe a que las funciones del paquete A
se escribieron con la expectativa de que el paquete B
y sus funciones se adjuntarían a la search()
ruta .
Una "Depends"
directiva cargará y adjuntará el paquete A
, en cuyo punto A
la propia "Depends"
directiva del paquete , en una reacción en cadena, hará que el paquete también B
se cargue y se adjunte. Las funciones en el paquete A
podrán encontrar las funciones en el paquete B
en las que se basan.
Una "Imports"
directiva cargará pero no adjuntará el paquete A
y no cargará ni adjuntará el paquete B
. ( "Imports"
Después de todo, espera que los escritores de paquetes están utilizando el mecanismo de espacio de nombres, y que el paquete A
va a utilizar "Imports"
hasta el punto de que cualquiera de las funciones en B
que necesitan tener acceso a.) Llama por sus funciones a cualquier función en el paquete A
que se basan en funciones en el paquete B
voluntad en consecuencia fracasan.
Las dos únicas soluciones son:
- Haga que su paquete adjunte el paquete
A
usando una "Depends"
directiva.
- Mejor a largo plazo, comuníquese con el responsable del paquete
A
y pídales que hagan un trabajo más cuidadoso al construir su espacio de nombres (en palabras de Martin Morgan en esta respuesta relacionada ).