Развернуть сценарий R [дублировать]

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

25
задан smci 15 July 2014 в 19:00
поделиться

3 ответа

Вы можете использовать результат функции available.packages. Например, чтобы узнать, от чего зависит ggplot2:

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

Что дает:

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

Обратите внимание, что в зависимости от того, что вы хотите достичь, вам может потребоваться проверить поле Imports тоже.

30
ответ дан juba 19 August 2018 в 01:55
поделиться
  • 1
    Cool - мне всегда нравится узнавать о удобных инструментах. К сожалению, это не сработает для тех из нас, кто придерживается корпоративного брандмауэра. Мы можем застрять, делая что-то вроде browseURL('http://cran.r-project.org/web/packages/package.name') – Carl Witthoft 1 February 2013 в 14:39
  • 2
    Спасибо, это очень помогло, я немного изменил область вопроса, но, рекурсивный поиск в списке для Depends and Imports, я был доступен для создания полного списка. – Jonathan Lisic 1 February 2013 в 16:07
  • 3
    @CarlWitthoft, если вы находитесь в окнах, может помочь setInternet2(). – hadley 1 February 2013 в 19:06
  • 4
    @hadley, спасибо, но я прошел через это упражнение некоторое время назад. исходящие запросы блокируются. Очевидно, нам нужен новый пакет r.apt-get :-) – Carl Witthoft 1 February 2013 в 19:27
  • 5
    @CarlWitthoft Я не знаю, есть ли у вас такая же проблема, но если проблема связана с прокси-сервером и приложениями, которые не могут пройти проверку подлинности, вы можете посмотреть в cntlm ( cntlm.sourceforge. нетто ) – Mark 10 February 2015 в 21:44

У меня нет R, и мне нужно выяснить, какие R-пакеты были зависимыми от списка R-пакетов, запрашиваемых для использования в моей компании.

Я написал сценарий bash, который выполняет итерацию поверх список R-пакетов в файле и будет рекурсивно обнаруживать зависимости.

Скрипт использует файл с именем rinput_orig.txt как вход (пример ниже). Скрипт создаст файл с именем rinput.txt, так как он выполнит свою работу.

Сценарий создаст следующие файлы:

  • rdepsfound.txt - отображает найденные зависимости, включая R, который зависит от него (пример ниже).
  • routeput.txt - список всех пакетов R (из исходного списка и списка зависимостей) вместе с лицензией и URL-адресом CRAN (пример ниже).
  • r404.txt - Список R пакетов, в которых 404 был получен при попытке скручивания. Это удобно, если в вашем исходном списке есть опечатки.

Сценарий Bash:

#!/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

Пример rinput_orig.txt:

shiny
rmarkdown
xtable
RODBC
RJDBC
XLConnect
openxlsx
xlsx
Rcpp

Пример консольного вывода при запуске скрипта:

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...

Пример 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

Пример routeput.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

Надеюсь, что это помогает кому-то!

5
ответ дан Jesse 19 August 2018 в 01:55
поделиться

Другим опрятным и простым решением является внутренняя функция recursivePackageDependencies из библиотеки packrat. Однако пакет должен быть установлен в некоторой библиотеке на вашем компьютере. Преимущество заключается в том, что он работает с самодельными пакетами, отличными от CRAN. Пример:

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

:

 [1] "R6"           "RColorBrewer" "Rcpp"         "colorspace"   "dichromat"    "digest"       "gtable"      
 [8] "labeling"     "lazyeval"     "magrittr"     "munsell"      "plyr"         "reshape2"     "rlang"       
 [15] "scales"       "stringi"      "stringr"      "tibble"       "viridisLite" 
1
ответ дан zerweck 19 August 2018 в 01:55
поделиться
  • 1
  • 2
    Я бы не сказал, что это утверждение верно в целом. Хотя этот совет, приведенный в документации, иногда может быть правдой, нет абсолютно никаких оснований не использовать этот код в сценарии для вашего собственного использования. Утверждение, вероятно, относится больше к случаям, когда такие функции используются в другом пакете для общего использования. – zerweck 1 August 2018 в 13:21
  • 3
    Ты прав. Я имел в виду именно это, вы должны подумать, где вы собираетесь это использовать. При кодировании вы можете делать почти все;) – Leo 1 August 2018 в 13:38
Другие вопросы по тегам:

Похожие вопросы: