ventajas studio sirven que puedo para paquetes los librería instalar instalados guardan donde r version-control dependencies packages

studio - Listado de dependencias de paquetes R sin instalar paquetes



r studio (3)

¿Existe una forma sencilla de obtener una lista de dependencias del paquete R (todas las dependencias recursivas) para un paquete determinado, sin instalar el paquete y sus dependencias? Algo similar a una instalación falsa en portupgrade o apt.


No tengo R instalada y necesitaba averiguar qué Paquetes R dependían de una lista de Paquetes R que se solicitan para mi empresa.

Escribí un script de bash que itera sobre una lista de paquetes R en un archivo y descubrirá dependencias recursivamente.

La secuencia de comandos utiliza un archivo llamado rinput_orig.txt como entrada (ejemplo a continuación). El script creará un archivo llamado rinput.txt a medida que realiza su trabajo.

El script creará los siguientes archivos:

  • rdepsfound.txt : enumera las dependencias encontradas, incluido el paquete R que depende de él (ejemplo a continuación).
  • routput.txt : muestra todos los paquetes R (de la lista original y la lista de dependencias) junto con la licencia y la URL de CRAN (ejemplo a continuación).
  • r404.txt - Lista de paquetes R donde se recibió un 404 al tratar de curl. Esto es útil si su lista original tiene errores tipográficos.

Bash script:

#!/bin/bash # CLEANUP rm routput.txt rm rdepsfound.txt rm r404.txt # COPY ORIGINAL INPUT TO WORKING INPUT cp rinput_orig.txt rinput.txt IFS="," while read PACKAGE; do echo Processing $PACKAGE... PACKAGEURL="http://cran.r-project.org/web/packages/${PACKAGE}/index.html" if [ `curl -o /dev/null --silent --head --write-out ''%{http_code}/n'' ${PACKAGEURL}` != 404 ]; then # GET LICENSE INFO OF PACKAGE LICENSEINFO=$(curl ${PACKAGEURL} 2>/dev/null | grep -A1 "License:" | grep -v "License:" | gawk ''match($0, /<a href=".*">(.*)<//a>/, a) {print a[0]}'' | sed "s/|/,/g" | sed "s/+/,/g") for x in ${LICENSEINFO[*]} do # SAVE LICENSE LICENSE=$(echo ${x} | gawk ''match($0, /<a href=".*">(.*)<//a>/, a) {print a[1]}'') break done # WRITE PACKAGE AND LICENSE TO OUTPUT FILE echo $PACKAGE $LICENSE $PACKAGEURL >> routput.txt # GET DEPENDENCIES OF PACKAGE DEPS=$(curl ${PACKAGEURL} 2>/dev/null | grep -A1 "Depends:" | grep -v "Depends:" | gawk ''match($0, /<a href=".*">(.*)<//a>/, a) {print a[0]}'') for x in ${DEPS[*]} do FOUNDDEP=$(echo "${x}" | gawk ''match($0, /<a href=".*">(.*)<//a>/, a) {print a[1]}'' | sed "s/<//span>//g") if [ "$FOUNDDEP" != "" ]; then echo Found dependency $FOUNDDEP for $PACKAGE... grep $FOUNDDEP rinput.txt > /dev/null if [ "$?" = "0" ]; then echo $FOUNDDEP already exists in package list... else echo Adding $FOUNDDEP to package list... # SAVE FOUND DEPENDENCY BACK TO INPUT LIST echo $FOUNDDEP >> rinput.txt # SAVE FOUND DEPENDENCY TO DEPENDENCY LIST FOR EASY VIEWING OF ALL FOUND DEPENDENCIES echo $FOUNDDEP is a dependency of $PACKAGE >> rdepsfound.txt fi fi done else echo Skipping $PACKAGE because 404 was received... echo $PACKAGE $PACKAGEURL >> r404.txt fi done < rinput.txt echo -e "/nRESULT:" sort -u routput.txt

Ejemplo rinput_orig.txt:

shiny rmarkdown xtable RODBC RJDBC XLConnect openxlsx xlsx Rcpp

Ejemplo de salida de consola al ejecutar un script:

Processing shiny... Processing rmarkdown... Processing xtable... Processing RODBC... Processing RJDBC... Found dependency DBI for RJDBC... Adding DBI to package list... Found dependency rJava for RJDBC... Adding rJava to package list... Processing XLConnect... Found dependency XLConnectJars for XLConnect... Adding XLConnectJars to package list... Processing openxlsx... Processing xlsx... Found dependency rJava for xlsx... rJava already exists in package list... Found dependency xlsxjars for xlsx... Adding xlsxjars to package list... Processing Rcpp... Processing DBI... Processing rJava... Processing XLConnectJars... Processing xlsxjars... Found dependency rJava for xlsxjars... rJava already exists in package list...

Ejemplo rdepsfound.txt:

DBI is a dependency of RJDBC rJava is a dependency of RJDBC XLConnectJars is a dependency of XLConnect xlsxjars is a dependency of xlsx

Ejemplo routput.txt:

shiny GPL-3 http://cran.r-project.org/web/packages/shiny/index.html rmarkdown GPL-3 http://cran.r-project.org/web/packages/rmarkdown/index.html xtable GPL-2 http://cran.r-project.org/web/packages/xtable/index.html RODBC GPL-2 http://cran.r-project.org/web/packages/RODBC/index.html RJDBC GPL-2 http://cran.r-project.org/web/packages/RJDBC/index.html XLConnect GPL-3 http://cran.r-project.org/web/packages/XLConnect/index.html openxlsx GPL-3 http://cran.r-project.org/web/packages/openxlsx/index.html xlsx GPL-3 http://cran.r-project.org/web/packages/xlsx/index.html Rcpp GPL-2 http://cran.r-project.org/web/packages/Rcpp/index.html DBI LGPL-2 http://cran.r-project.org/web/packages/DBI/index.html rJava GPL-2 http://cran.r-project.org/web/packages/rJava/index.html XLConnectJars GPL-3 http://cran.r-project.org/web/packages/XLConnectJars/index.html xlsxjars GPL-3 http://cran.r-project.org/web/packages/xlsxjars/index.html

¡Espero que esto ayude a alguien!


Otra solución simple y ordenada es la función interna recursivePackageDependencies de la biblioteca packrat . Sin embargo, el paquete debe estar instalado en alguna biblioteca de su máquina. La ventaja es que también funciona con paquetes no hechos a partir de CRAN. Ejemplo:

packrat:::recursivePackageDependencies("ggplot2",lib.loc = .libPaths()[1])

dando:

[1] "R6" "RColorBrewer" "Rcpp" "colorspace" "dichromat" "digest" "gtable" [8] "labeling" "lazyeval" "magrittr" "munsell" "plyr" "reshape2" "rlang" [15] "scales" "stringi" "stringr" "tibble" "viridisLite"


Puede utilizar el resultado de la función available.packages . Por ejemplo, para ver de qué depende ggplot2 :

pack <- available.packages() pack["ggplot2","Depends"]

Lo que da :

[1] "R (>= 2.14), stats, methods"

Tenga en cuenta que, dependiendo de lo que desee lograr, es posible que también deba marcar el campo Imports .