2011-06-08 27 views
27

Me pregunto si hay una manera de utilizar install.packages() u otras funciones relacionadas para hacer lo siguiente: única descargar las fuentes (es decir tar.gz archivos) de los paquetes especificados y todas sus dependencias en una carpeta especificada (en Windows).Sólo las fuentes de descarga de un paquete y todas las dependencias

Una razón para hacer esto es: decir que tengo una cuenta de Linux que no está habilitada para el acceso a Internet. Con el fin de instalar los paquetes en la máquina Linux, me gustaría primero descargar todas las fuentes necesarias en mi máquina de Windows, a continuación, ftp ellos a la máquina Linux, e instalarlas en la máquina Linux usando

install.packages('/home/me/R/Packages/blah.tar.gz', repos = NULL) 

Respuesta

13

Ahora hay mejores opciones para esto en el herramientas paquete que viene con la base R: package_dependencies(). Consulte, por ejemplo, la Respuesta de @ sebastian-c y este recent Q&A para un caso de uso relacionado.


Hay un getDependencies() función dejados de exportar en el paquete de utilidades. No he estudiado cómo funciona, pero combinar eso con la Respuesta de @ Dirk debería hacerte llegar hasta allí.

Básicamente embargo, parece que lo utilice como:

utils:::getDependencies(pkgs, dependencies, available, lib) 

donde pkgs es el vector de caracteres de los paquetes a instalar, dependencies es un vector de caracteres de tipos de dependencias (depende, mejora, etc.) que desee , available es la salida de available.packages() y lib es la ubicación de la biblioteca para los paquetes dentro de los cuales se evalúan las dependencias.

Si se depura install.packages() que está haciendo básicamente el paso getDependencies() a continuación, @download.packages() paso de Dirk antes de que realmente comienza a instalar nada.

+0

+1 ¡Gracias! - Estoy retocando 'utils ::: getDependencies' para obtener la lista de paquetes dependientes e ignorar lo que ya he instalado. Esto más 'download.packages' debería hacerlo. –

+0

@Prasad ¿No es eso lo que 'getDependencies()' hace de todos modos, al menos para mí, solo enumera paquetes que aún no tengo instalados en 'lib'? –

+0

correcto, pero recuerde que ya tengo todo instalado en mi máquina Win, y estoy tratando de obtener la lista de paquetes dependientes para un paquete existente, de modo que pueda obtener sus fuentes, ftp a la máquina Linux, e instalarlas allí . Una vez que paso sobre todos los archivos 'tar.gz' a la máquina Linux, los instalo en la secuencia apropiada, usando' install.packages ('blah.tar.gz', ...) 'para que todo funcione. –

16

Trate download.packages(c("xts", "rms"), "c:/TEMP", .....) en lugar de install.packages(); directamente puede darle un directorio de destino en el segundo argumento.

Editar varios años después: Como se indicó anteriormente en otras respuestas y comentarios, ahora se han agregado varias funciones auxiliares a las herramientas de R y paquetes utils. R 3.4.0 tendrá tools::CRAN_package_db() para descargar el archivo de nivel superior PACKAGES.rds (y, por supuesto, también puede combinar download.file() y readRDS() para eso).

+0

Eso es lo que estaba pensando, pero ¿cómo recoges las dependencias también? –

+1

Posiblemente "a mano" utilizando 'read.dcf()' y sus amigos para analizar el archivo de control (que usted acierta directamente desde CRAN, por ejemplo, eso es lo que hace CRANberries). Ah, y 'cran2deb' tendrá la lógica, ya que incluso crea dependencias primero. –

+0

Tenía la esperanza de que, dado que 'install.packages' encuentre automágicamente todas las dependencias, de alguna manera habría algún modo de cerrar la fase de" instalación ", de modo que tengamos el conjunto correcto de archivos descargados. –

29

Recientemente tuve un problema donde quería descargar todas las dependencias y yo hemos resuelto así:

decir que quiero todas las dependencias y las importaciones de ggplot2 y MASS:

getPackages <- function(packs){ 
    packages <- unlist(
    tools::package_dependencies(packs, available.packages(), 
         which=c("Depends", "Imports"), recursive=TRUE) 
) 
    packages <- union(packs, packages) 
    packages 
} 

packages <- getPackages(c("ggplot2", "MASS")) 

que pueda ahora descargue los paquetes a otro directorio.

download.packages(packages, destdir="whereyouactuallywantthefiles", 
        type="source") 

A partir de ahí, si usted quiere hacer un acuerdo de recompra local de su PC con Linux, siga las instrucciones here.

Cuestiones relacionadas