Как установить зависимости при использовании "R CMD INSTALL" для установки пакетов R?
Я разрабатываю свой первый пакет R (используя R 2.13, Ubuntu 10.10). Позвольте называть его foo и скажем, что код в каталоге R/начинается с библиотеки строк (bar), где bar - это существующий пакет, в CRAN, от которого зависит foo. Мой файл DESCRIPTION содержит строку:
Depends: bar
Когда пакет foo готов к тестированию, я устанавливаю его локально, используя:
R CMD INSTALL foo_1.0.tar.gz
Однако, если бар не установлен, я вижу:
ERROR: dependency ‘bar’ is not available for package ‘foo’
Очевидно, что если мои foo были установлены из CRAN с помощью install.packages(), панель будет установлена одновременно. Поэтому мой вопрос: как я могу убедиться, что панель пакетов CRAN установлена, если требуется, когда я устанавливаю свой пакет foo с помощью R CMD INSTALL? Является ли это заданием для конфигурации script?
Ответы
Ответ 1
Собственно, перечитав руководство R-расширений, он не говорит, что R CMD INSTALL получит зависимости от CRAN. Метод install.packages() из R будет делать это, но на первый взгляд я не думаю, что R CMD INSTALL делает.
Вы можете использовать install.packages для установки из .tar.gz, но вам нужно установить repos = NULL, а затем это применимо:
dependencies: logical indicating to also install uninstalled packages
on which these packages depend/suggest/import (and so on
recursively). Not used if repos = NULL.
Я подозреваю, что нужно сделать, чтобы получить зависимости из файла DESCRIPTION, а затем запустить R и сделать install.packages() для тех, кто тестирует вашу сборку в чистой среде.
Ответ 2
К счастью Devtools обеспечивает простое решение: install_deps()
install_deps (pkg = ".", dependencies = logical, threads = getOption ( "Ncpus", 1))
Аргументы:
pkg: описание пакета, может быть путь или имя пакета. Видеть 'As.package для получения дополнительной информации
зависимости: "логическое указание на установку удаленных пакетов который этот pkg зависит от/ссылок на/предлагает. См. Аргумент 'Зависимостей' install.packages.
threads: количество одновременных потоков для установки зависимостей. По умолчанию используется опция "Ncpus" или "1 if неустановленный.
Примеры:
install_deps(".")
install_deps("/path/to/package",dependencies="logical")
Ответ 3
В итоге я просто использовал документ bash здесь и указал зеркало облака, чтобы найти зависимости:
sudo R --vanilla <<EOF
install.packages('forecast', repos='http://cran.us.r-project.org')
q()
EOF
пакет R "прогноз", облачное зеркало, которое я использовал, было http://cran.us.r-project.org. Если вы хотите использовать другое зеркало, вот они: https://cran.r-project.org/mirrors.html
Вышеописанное помогло мне получить пакеты R в сценарии начальной загрузки AWS EMR.
Ответ 4
Подобно @Jonathan Le, но лучше для использования script:
sudo R --vanilla -e 'install.packages("forecast", repos="http://cran.us.r-project.org")'
Ответ 5
Механизм для этого заключается в добавлении записи в поле depends
в ваш файл DESCRIPTION
.
Depends: bar
Загрузите библиотеку bar
, если она уже установлена, иначе она будет установлена из CRAN.
Это описано в разделе 1.1.1 руководства Writing R extensions
: http://cran.r-project.org/doc/manuals/R-exts.html#The-DESCRIPTION-file
Ответ 6
Бонусные очки:
Как сделать этот процесс полностью автоматическим, не задавая вопросов/необходимости взаимодействовать с пользователем, даже если это первый раз, когда пользователь устанавливает пакет R?
т.е. install.packages должен создать некоторый каталог библиотеки на уровне пользователя и использовать всю необходимую информацию по умолчанию и рабочие параметры по умолчанию.
PS: Мне не разрешено публиковать комментарии этого автократического сайта
Ответ 7
Следуя идее Romain Rossi, вот простой сценарий оболочки, который устанавливает каждый аргумент, который вы отправляете ему (при условии, что это пакет):
#!/bin/sh
for f in $*
do
sudo R --vanilla -e "install.packages('"$f"', repos='http://cran.us.r-project.org')"
done