El manual " Escritura de extensiones R " proporciona la siguiente guía sobre cuándo usar Importaciones o Depende:
Las reglas generales son
- Los paquetes cuyo espacio de nombres solo es necesario para cargar el paquete usando la biblioteca (pkgname) deben aparecer en el campo 'Importaciones' y no en el campo 'Depende'.
- Los paquetes que deben adjuntarse para cargar con éxito el paquete usando la biblioteca (pkgname) solo deben aparecer en el campo 'Depende'.
¿Alguien puede proporcionar un poco más de claridad sobre esto? ¿Cómo sé cuándo mi paquete solo necesita espacios de nombres cargados y cuándo necesito adjuntar un paquete? ¿Cuáles son ejemplos de ambos? Creo que el paquete típico es solo una colección de funciones que a veces llaman funciones en otros paquetes (donde ya se ha codificado un poco de trabajo). ¿Es este escenario 1 o 2 arriba?
Editar
Escribí una publicación de blog con una sección sobre este tema específico (busque 'Importaciones v Depende'). Las imágenes hacen que sea mucho más fácil de entender.

Respuestas:
"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 porsearch()). 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 paquetesgamymgcv. Si se cargaron otros dos paquetes, uno de los cuales dependegamy el otro depende demgcv, la función encontrada por las llamadas agam()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 requiereimportoimportFromdirectivas en elNAMESPACEarchivo), las cosas mejorarían de dos maneras. (1) El paquete en sí mismo obtendría el control sobre quémgcvfunció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 otramgcvfunció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
Aque se encuentra"Depends"en otro paqueteB, es probable que deba adjuntarloAcon una"Dependsdirectiva.Esto se debe a que las funciones del paquete
Ase escribieron con la expectativa de que el paqueteBy sus funciones se adjuntarían a lasearch()ruta .Una
"Depends"directiva cargará y adjuntará el paqueteA, en cuyo puntoAla propia"Depends"directiva del paquete , en una reacción en cadena, hará que el paquete tambiénBse cargue y se adjunte. Las funciones en el paqueteApodrán encontrar las funciones en el paqueteBen las que se basan.Una
"Imports"directiva cargará pero no adjuntará el paqueteAy no cargará ni adjuntará el paqueteB. ("Imports"Después de todo, espera que los escritores de paquetes están utilizando el mecanismo de espacio de nombres, y que el paqueteAva a utilizar"Imports"hasta el punto de que cualquiera de las funciones enBque necesitan tener acceso a.) Llama por sus funciones a cualquier función en el paqueteAque se basan en funciones en el paqueteBvoluntad en consecuencia fracasan.Las dos únicas soluciones son:
Ausando una"Depends"directiva.Ay pídales que hagan un trabajo más cuidadoso al construir su espacio de nombres (en palabras de Martin Morgan en esta respuesta relacionada ).fuente
ImportsyDependswrt y la comprobación de ejemplos en.Rdarchivos son realmente sutiles y vale la pena conocerlas.Imports: ggplot2, ¿por qué mi paquete no encuentra laautoplotfunción? ObviamenteDependsadjunta la biblioteca de paquetes deggplot2y, por lo tanto, no hay problema. Por ejemplo, tengo una funciónautoplot.myFunction()que usa la@import ggplot2etiqueta y mi paquete tieneImports: ggplot2pero recibo un error:Error in eval(expr, envir, enclos) : could not find function "autoplot"cuando trato de usarla.Dependsy , realmente estaba preguntando qué significa "importar" una función (en lugar de "depender" de ella). Como esa última es la pregunta que intenté responder (y, sospecho, lo que la mayoría de las personas que buscan esta respuesta quieren saber), dejaré la respuesta sin cambios.ImportsDESCRIPTIONHadley Wickham da una explicación fácil ( http://r-pkgs.had.co.nz/namespace.html ):
fuente
Chambers en SfDA dice que use 'Importaciones' cuando este paquete usa un mecanismo de 'espacio de nombres' y dado que ahora se requiere que todos los paquetes los tengan, entonces la respuesta podría ser siempre usar 'Importaciones'. En el pasado, los paquetes podrían haberse cargado sin tener espacios de nombres y, en ese caso, debería haber utilizado Depends.
fuente
<namespace:packageName>, como parte de<imports:packageName>. Nolibrary()es necesario llamar más y R no lo notificará en la consola en el momento de la carga del paquete a menos queImportno se pueda encontrar el paquete ed.Aquí hay una pregunta simple para ayudarlo a decidir cuál usar:
¿Su paquete requiere que el usuario final tenga acceso directo a las funciones de otro paquete?
El único momento en que debe usar 'Depends' es cuando su paquete es un complemento o compañero de otro paquete, donde su usuario final utilizará funciones de su paquete y del paquete 'Depends' en su código. Si su usuario final solo interactuará con sus funciones, y el otro paquete solo estará trabajando detrás de escena, entonces use 'Importaciones' en su lugar.
La advertencia a esto es que si agrega un paquete a 'Importaciones', como debería hacerlo normalmente, su código deberá referirse a las funciones de ese paquete, utilizando la sintaxis completa del espacio de nombres, por ejemplo
dplyr::mutate(), en lugar de solomutate(). Hace que el código sea un poco más complicado de leer, pero es un pequeño precio a pagar por una mejor higiene del paquete.fuente