Énumérer Les Dépendances Des Paquets R Sans Installer Les Paquets

y a-t-il un moyen simple d'obtenir une liste des dépendances du paquet R (Toutes les dépendances récursives) pour un paquet donné, sans installer le paquet et ses dépendances? Quelque chose de similaire à une fausse installation dans portupgrade ou apt.

25
demandé sur smci 2013-02-01 15:31:43
la source

3 ответов

vous pouvez utiliser le résultat du available.packages fonction. Par exemple, pour voir ce que ggplot2 dépend :

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

ce Qui donne :

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

notez que selon ce que vous voulez accomplir, vous pouvez avoir besoin de vérifier le Imports champ, trop.

30
répondu juba 2013-02-01 15:43:15
la source

Je n'ai pas installé R et j'avais besoin de savoir quels paquets R étaient des dépendances à partir d'une liste de paquets R demandés par mon entreprise.

j'ai écrit un script bash qui itère sur une liste de paquets R dans un fichier et découvrira récursivement des dépendances.

Le script utilise un fichier nommé rinput_orig.txt en entrée (exemple ci-dessous). Le script va créer un fichier nommé rinput.txt comme il fait son travail.

Le script va créer les fichiers suivants:

  • rdepsfound.txt - liste les dépendances trouvées, y compris le paquet R qui en dépend (exemple ci-dessous).
  • routput.txt - liste tous les paquets R (à partir de la liste originale et de la liste des dépendances) ainsi que L'URL de la licence et du CRAN (exemple ci-dessous).
  • r404.txt - liste des paquets R pour lesquels un 404 a été reçu curl. C'est pratique si votre liste initiale a des fautes de frappe.

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(, /<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(, /<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(, /<a href=".*">(.*)<\/a>/, a) {print a[0]}')
        for x in ${DEPS[*]}
        do
            FOUNDDEP=$(echo "${x}" | gawk 'match(, /<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

exemple rinput_orig.txt:

shiny
rmarkdown
xtable
RODBC
RJDBC
XLConnect
openxlsx
xlsx
Rcpp

exemple de sortie de la console lors de l'exécution du 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...

exemple 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

exemple 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

j'espère que cela aide quelqu'un!

6
répondu Jesse 2015-09-03 19:55:45
la source

une autre solution nette et simple est la fonction interne recursivePackageDependencies à partir de la bibliothèque packrat. Cependant, le paquet doit être installé dans bibliothèque sur votre machine. L'avantage est qu'il fonctionne aussi avec des paquets autoproduits non-CRAN. Exemple:

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

donne:

 [1] "R6"           "RColorBrewer" "Rcpp"         "colorspace"   "dichromat"    "digest"       "gtable"      
 [8] "labeling"     "lazyeval"     "magrittr"     "munsell"      "plyr"         "reshape2"     "rlang"       
 [15] "scales"       "stringi"      "stringr"      "tibble"       "viridisLite" 
1
répondu zerweck 2018-02-06 17:39:36
la source

Autres questions sur