2011-12-26 13 views
122

El "Writing R Extensions" manual proporciona la orientación sobre cuándo utilizar importaciones o Depende:mejor explicación de cuándo utilizar las importaciones/Depende

The general rules are

  • Packages whose namespace only is needed to load the package using library(pkgname) must be listed in the ‘Imports’ field and not in the ‘Depends’ field.
  • Packages that need to be attached to successfully load the package using library(pkgname) must be listed in the ‘Depends’ field, only.

Puede alguien dar un poco más de claridad en esto? ¿Cómo puedo saber si 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 simplemente 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 anterior?

Editar

me escribió una blog post con una sección sobre este tema específico (búsqueda de 'Las importaciones v Depende'). Las imágenes hacen que sea mucho más fácil de entender.

+0

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! –

Respuesta

117

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

  1. Tener su paquete adjuntar paquete A utilizando una directiva "Depends".
  2. 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).
+0

¡ah! gracias Josh, estás en racha hoy. – SFun28

+0

Bueno, ambas han sido preguntas interesantes, y como recientemente comencé a empaquetar algunos de mis propios proyectos, he estado viajando por las mismas rutas de pensamiento que tú;) –

+1

Habiendo hecho una pregunta similar recientemente y Recientemente luché poderosamente con estos temas, estos son conceptos sutiles ya menudo mal comunicados. Te referiré aquí para otra explicación: http: // stackoverflow.com/questions/7880355/upcoming-namespace-depends-imports-changes-for-2-14-0-some-definitions-use-pl –

13

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 lo tengan, entonces la respuesta podría ser siempre usar 'Importaciones'. En el pasado, los paquetes podían haberse cargado sin tener espacio de nombres y en ese caso necesitarías haber usado Depends.

+2

cuando un paquete se especifica en "importaciones" y quiero usar una función en el paquete, ¿mis propias funciones necesitan llamar a la biblioteca (...) o todas las funciones ya están disponibles en la ruta de búsqueda? Además, ¿qué es SfDA? ¿campo de golf? – SFun28

+2

* Software para análisis de datos *: http://www.springer.com/statistics/computanional+statistics/book/978-0-387-75935-7 ... en cuanto a sus preguntas, no sé la respuesta de forma directa, pero podría piratear un paquete de prueba mínimo con bastante facilidad y encontrar la respuesta empíricamente ... –

+1

SfDA == "Software for Data Analysis". [65] en http://www.r-project.org/doc/bib/R-books.html. Si un paquete especifica otro paquete, debería ver un mensaje que le informa sobre la carga de depend (encies) e importar (aciones) cuando usa library() o require() en la consola. Sí, deberían estar disponibles. –

23

Hadley Wickham da una explicación fácil (http://r-pkgs.had.co.nz/namespace.html):

Listing a package in either Depends or Imports ensures that it’s installed when needed. The main difference is that where Imports just loads the package, Depends attaches it. There are no other differences. [...]

Unless there is a good reason otherwise, you should always list packages in Imports not Depends . That’s because a good package is self-contained, and minimises changes to the global environment (including the search path). The only exception is if your package is designed to be used in conjunction with another package. For example, the analogue package builds on top of vegan. It’s not useful without vegan, so it has vegan in Depends instead of Imports . Similarly, ggplot2 should really Depend on scales, rather than Importing it.