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 paquetesgam
ymgcv
. Si se cargaron otros dos paquetes, uno de los cuales dependegam
y 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 requiereimport
oimportFrom
directivas en elNAMESPACE
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 otramgcv
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 paqueteB
, es probable que deba adjuntarloA
con una"Depends
directiva.Esto se debe a que las funciones del paquete
A
se escribieron con la expectativa de que el paqueteB
y sus funciones se adjuntarían a lasearch()
ruta .Una
"Depends"
directiva cargará y adjuntará el paqueteA
, en cuyo puntoA
la propia"Depends"
directiva del paquete , en una reacción en cadena, hará que el paquete tambiénB
se cargue y se adjunte. Las funciones en el paqueteA
podrán encontrar las funciones en el paqueteB
en las que se basan.Una
"Imports"
directiva cargará pero no adjuntará el paqueteA
y 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 paqueteA
va a utilizar"Imports"
hasta el punto de que cualquiera de las funciones enB
que necesitan tener acceso a.) Llama por sus funciones a cualquier función en el paqueteA
que se basan en funciones en el paqueteB
voluntad en consecuencia fracasan.Las dos únicas soluciones son:
A
usando una"Depends"
directiva.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 ).fuente
Imports
yDepends
wrt y la comprobación de ejemplos en.Rd
archivos son realmente sutiles y vale la pena conocerlas.Imports: ggplot2
, ¿por qué mi paquete no encuentra laautoplot
función? ObviamenteDepends
adjunta la biblioteca de paquetes deggplot2
y, por lo tanto, no hay problema. Por ejemplo, tengo una funciónautoplot.myFunction()
que usa la@import ggplot2
etiqueta y mi paquete tieneImports: ggplot2
pero recibo un error:Error in eval(expr, envir, enclos) : could not find function "autoplot"
cuando trato de usarla.Depends
y , 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.Imports
DESCRIPTION
Hadley 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 queImport
no 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