values ticks ggplot change r

ticks - Una mejor explicación de cuándo usar Importaciones/Dependencias



ggplot title center (4)

El manual " Writing R Extensions " brinda la siguiente guía sobre cuándo usar Imports o Depends:

Las reglas generales son

  • Los paquetes cuyo espacio de nombres solo es necesario para cargar el paquete utilizando la biblioteca (pkgname) deben aparecer en el campo "Importaciones" y no en el campo "Depende".
  • Los paquetes que deben adjuntarse para cargar correctamente el paquete utilizando la biblioteca (pkgname) deben aparecer solo en el campo "Depende".

¿Alguien puede dar un poco más de claridad sobre 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

Escribí una publicación de blog con una sección sobre este tema específico (busque ''Imports v Depends''). Las imágenes hacen que sea mucho más fácil de entender.


Aquí hay una pregunta simple para ayudarte a decidir cuál usar:

¿Su paquete requiere que el usuario final tenga acceso directo a las funciones de otro paquete?

  • NO -> Importaciones (respuesta más común)
  • SÍ -> Depende

La única vez que debe usar ''Depende'' es cuando su paquete es un complemento o complemento de otro paquete, donde su usuario final utilizará funciones de su paquete y del paquete ''Depende'' en su código. Si su usuario final solo interactúa con sus funciones, y el otro paquete solo estará trabajando detrás de escena, entonces use ''Importaciones''.

La advertencia de esto es que si agrega un paquete a ''Imports'', 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 solo mutate() . Hace que el código sea un poco más complicado de leer, pero es un precio pequeño a pagar para una mejor higiene del paquete.


Chambers en SfDA dice que use ''Importaciones'' cuando este paquete usa un mecanismo de ''espacio de nombres'' y dado que ahora todos los paquetes deben tenerlos, entonces la respuesta ahora 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.


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

La inclusión de un paquete en Depends o Imports garantiza que esté instalado cuando sea necesario. La principal diferencia es que cuando Imports solo carga el paquete, Depends conecta. No hay otras diferencias [...]

A menos que haya una buena razón de lo contrario, siempre debe enumerar los paquetes en Imports no Depends . Esto se debe a que un buen paquete es autónomo y minimiza los cambios en el entorno global (incluida la ruta de búsqueda). La única excepción es si su paquete está diseñado para usarse junto con otro paquete. Por ejemplo, el paquete analógico se construye encima de vegano. No es útil sin vegano, por lo que tiene vegan en Depends en lugar de Imports . Del mismo modo, ggplot2 realmente debería depender de las escalas, en lugar de importarlo.


"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 usan "Depends" ).

Una directiva de "Depends" intenta asegurar que una función de otro paquete esté disponible uniendo 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 ( en SoDA ) usa el ejemplo de la función "gam" , que se encuentra en los paquetes gam y mgcv . Si se cargaran otros dos paquetes, uno de ellos depende de gam y el otro 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.

Una directiva de "Imports" coloca el paquete importado en <imports:packageName> (buscado inmediatamente después de <namespace:packageName> ), en lugar de en la ruta de búsqueda normal. Si alguno de los paquetes del ejemplo anterior utilizó el mecanismo de "Imports" , los asuntos se mejorarían de dos maneras. (1) El paquete obtendría control sobre la función de mgcv . (2) Al mantener la ruta de búsqueda principal libre de objetos importados, ni siquiera podría potencialmente romper la dependencia del otro paquete de la otra función de mgcv .

Esta es la razón por la cual el uso de espacios de nombres es una buena práctica, por qué ahora es implementado por CRAN y (en particular) por qué el uso de "Imports" es más seguro que usar "Depends" .

Editado para agregar una advertencia importante:

Desafortunadamente, hay una excepción común al consejo anterior: si su paquete se basa en un paquete A que "Depends" de otro paquete B , es probable que su paquete tenga que adjuntar A con una directiva "Depends .

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 ruta de search() .

Una directiva de "Depends" cargará y adjuntará el paquete A , en cuyo punto la propia directiva "Depends" paquete A , en una reacción en cadena, causará que el paquete B sea ​​cargado y adjuntado también. Las funciones del paquete A podrán entonces encontrar las funciones del paquete B del que dependen.

Una directiva de "Imports" se 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 usando el mecanismo del espacio de nombres, y que el paquete A usará "Imports" para señalar cualquier función en B que necesite acceder). Llamadas por sus funciones a cualquier función en el paquete A que depende de las funciones del paquete B , fracasará en consecuencia.

Las únicas dos soluciones son:

  1. Haga que su paquete adjunte el paquete A usando una directiva "Depends" .
  2. Mejor en el largo plazo, póngase en contacto 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 ).