2011-08-02 36 views
32

Estoy desarrollando mi primer paquete R (usando R 2.13, Ubuntu 10.10). Digamos que es foo y digamos que el código en el directorio/R comienza con la biblioteca línea (bar), donde barra es un paquete existente, en CRAN, en el que foo depende. Mi archivo de descripción contiene la línea:¿Cómo instalar las dependencias cuando se usa "R CMD INSTALL" para instalar los paquetes R?

Depends: bar 

Cuando el paquete foo está listo para la prueba, lo instalo localmente usando:

R CMD INSTALL foo_1.0.tar.gz 

Sin embargo, si barra no está instalado, veo:

ERROR: dependency ‘bar’ is not available for package ‘foo’ 

Obviamente, si mi foo eran instalado desde CRAN usando install.packages(), bar se instalaría al mismo tiempo. Entonces mi pregunta es: ¿cómo puedo asegurar que el paquete CRAN bar esté instalado, si es necesario, cuando instale mi paquete foo usando R CMD INSTALL? ¿Es esto un trabajo para un script de configuración?

Respuesta

14

En realidad, la relectura de la guía extensiones R, que no dice que R CMD INSTALAR recibirá dependencias del CRAN. El método install.packages() desde dentro de R lo hará, pero a primera vista no creo que R CMD INSTALL lo haga.

Puede utilizar install.packages instalar desde un .tar.gz, pero hay que establecer acuerdos de recompra = NULL, y luego esto se aplica:

dependencies: logical indicating to also install uninstalled packages 
      on which these packages depend/suggest/import (and so on 
      recursively). Not used if repos = NULL. 

Sospecho que lo que hay que hacer es conseguir la dependencias fuera del archivo DESCRIPTION y luego ejecute R y haga un install.packages() en esos cuando está probando su compilación en un ambiente limpio.

+1

Sí, tengo entendido que DESCRIPTION declara las dependencias, pero no las instala. Y el problema con la configuración de repos = NULL para el tarball es que los paquetes de dependencia no se obtendrán de CRAN. Estoy tratando de ponerme en la piel de un usuario que descarga e instala mi tarball; ¿Deberían esperar leer la documentación y los mensajes de error o hay una solución? – neilfws

+0

La solución es que coloque su paquete en CRAN y luego haga que el usuario instale paquetes y obtenga las dependencias. Supongo que puede haber alguna razón por la que no puedes hacer esto. La instalación desde archivos tar no es una operación de "usuario simple", por lo que no se les aplica una cuchara, y deberían poder leer los mensajes de error y su documentación. – Spacedman

+0

Derecha. Creo que cuando se prueba a nivel local, sé que tengo las dependencias y si va a CRAN, CRAN se encarga de las dependencias, así que realmente no es un problema :) – neilfws

1

El mecanismo para hacer esto es agregar una entrada en el campo depends en su archivo DESCRIPTION.

Depends: bar 

Esto cargará la biblioteca bar si ya está instalado, de lo contrario va a instalar desde CRAN.

Esto se describe en la sección 1.1.1 del manual Writing R extensions: http://cran.r-project.org/doc/manuals/R-exts.html#The-DESCRIPTION-file

+2

tengo el campo depende en la descripción, pero la barra no se instala desde CRAN cuando intento instalar foo. – neilfws

+4

No puede. Pero si y cuando * su * paquete foo está en CRAN * y * un usuario lo selecciona, ella también recibirá una barra. Alternativamente, puede crear un repositorio local y colocar tanto la barra como el foo, y luego obtener el mismo comportamiento. –

12

Afortunadamente Devtools proporciona una solución fácil: install_deps()

install_deps (PKG =, dependencias = lógicos, hilos = getOption ("ncpus " 1)".")

Argumentos:
PKG : descripción del paquete, puede ser ruta o nombre del paquete. Ver ‘as.package’ para obtener más información

dependencias: ‘lógico’ que indica también instalar paquetes desinstalados la que este ‘paquete’ depende de enlaces/a/sugiere.Ver el argumento 'dependencias' de 'install.packages'.

hilos: número de hilos concurrentes a utilizar para la instalación de dependencias. Se predetermina a la opción '' Ncpus '' o '1' si no está ajustado.

Ejemplos:

 
install_deps(".") 
install_deps("/path/to/package",dependencies="logical") 
+1

gracias; esto era una pregunta "pre-devtools", pero la vida es mucho más fácil ahora – neilfws

+0

Esto funciona en un directorio con un paquete que desea instalar, pero no con un archivo '.tar.gz'. Efectivamente, no puede pasar la ruta a un archivo '.tar.gz' a' install_deps' para instalar las dependencias, antes de instalar realmente el archivo '.tar.gz'. –

+0

@neilfws marque esta respuesta como correcta. – emisilva

3

Acabé usando una fiesta aquí-documento y especificar el espejo nube para encontrar las dependencias:

paquete
sudo R --vanilla <<EOF 
install.packages('forecast', repos='http://cran.us.r-project.org') 
q() 
EOF 

la R es "pronóstico", el espejo de nube que utilicé fue http://cran.us.r-project.org. Si desea utilizar un espejo diferente, aquí todos ellos son: https://cran.r-project.org/mirrors.html

Lo anterior trabajó para mí en conseguir paquetes de R en un shell script de arranque AWS EMR.

0

similares a Le @ Jonathan, pero es mejor para el uso de la escritura:

sudo R --vanilla -e 'install.packages("forecast", repos="http://cran.us.r-project.org")' 
Cuestiones relacionadas