2011-08-01 15 views
12

Tengo un paquete con un montón de funciones varias (consulte What to do with imperfect-but-useful functions?). Debido a que las funciones no están particularmente relacionadas, dependen de muchos otros paquetes. A menudo habrá solo una función en todo el paquete que use otro paquete. Sin embargo, si utilizo Imports, Suggests o Depends en el archivo DESCRIPTION, la lista completa de paquetes se cargará cada vez que se cargue mi paquete, aunque muy pocos de ellos sean necesarios para un usuario determinado.Cargue un paquete solo cuando sea necesario en el paquete R

¿Hay alguna manera de simplemente cargar las dependencias solo cuando se usa una función en particular? Pude llamar al library() dentro de la función, pero eso parece una mala práctica ya que no le dice nada al sistema de administración de paquetes y, por lo tanto, es posible que el usuario no lo tenga instalado.

Respuesta

15

Puede usar Sugerencias, y en la función que necesita el paquete puede agregar el código a require() dicho paquete y si no está disponible arrojar un error. Un ejemplo que conozco, el paquete vegetariana, tiene, en su descripción

Depends: permute 
Suggests: MASS, mgcv, lattice, cluster, scatterplot3d, rgl, tcltk 

y sobre cómo cargar el paquete tenemos:

R> require(vegan) 
Loading required package: vegan 
Loading required package: permute 
This is vegan 1.90-0 

y sessionInfo() informes que ninguno de los paquetes sugeridos todavía no se ha cargado/etc adjunta:

R> sessionInfo() 
R version 2.13.1 Patched (2011-07-29 r56550) 
Platform: x86_64-unknown-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_GB.utf8  LC_NUMERIC=C    
[3] LC_TIME=en_GB.utf8  LC_COLLATE=en_GB.utf8  
[5] LC_MONETARY=C    LC_MESSAGES=en_GB.utf8 
[7] LC_PAPER=en_GB.utf8  LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C   
[11] LC_MEASUREMENT=en_GB.utf8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] vegan_1.90-0 permute_0.5-0 

loaded via a namespace (and not attached): 
[1] tools_2.13.1 
+0

Eso es exactamente lo que estaba buscando. Gracias. –

+4

+1 esta estrategia es probablemente la adecuada para un paquete misceláneo: '' Los paquetes 'Suggest'ed no necesitan ser instalados para instalar su paquete. Para un paquete misceláneo que puede ser una gran ventaja. P.ej. los usuarios pueden usar la parte non-rgl de vegan incluso si rgl no se puede instalar en su máquina. Solo las funciones de uso de rgl no están disponibles en este caso. – cbeleites

+0

@cbeleites Esa es la razón por la cual Jari Oksanen (desarrollador vegano principal) eligió usar Sugerencias para los paquetes adicionales que usamos. –

14

en general, trato de evitar el uso de require() en paquetes. Como sugerencia, trabaje con un espacio de nombres (eso no es difícil) y use Imports: los paquetes mencionados allí no están cargados. Puede importar solo una función de otro paquete por:

  • usando la declaración importFrom en el archivo de espacio de nombres. importFrom(foo, x, y) indica que se deben importar las funciones x y y del paquete foo.
  • usando el operador de dos puntos en el código: foo::bar importa la función bar del paquete foo. p.ej. plyr::ddply(...) se entra a la función ddply sin el paquete se carga
  • o el operador de colon triple en el caso de objetos que no se exportan (foo:::bar)

En los tres casos, los paquetes debe ser mencionado en las importaciones. Ver también el capítulo relevante 1.6 y otros en Writing R Extensions.

EDITAR: como @Gavin señaló, todo esto funciona solo cuando se importa desde un paquete con un espacio de nombres propio aparentemente. A partir de la próxima versión de R on (2.14?) Todos los paquetes deben tener un espacio de nombre.

+2

+1 Eso supone que un paquete tiene un NAMESPACE - muchos no lo hacen ahora, pero todos serán a partir de la próxima versión principal de R. –

+0

Véase también la discusión aquí http: //chat.stackoverflow.com/transcript/message/1143070 # 1143070 –

+0

@Gavin Thx por señalar eso. Actualizado la respuesta. –

Cuestiones relacionadas