#r
#r
Вопрос:
Мне нужно создать воспроизводимую установку R из командной строки. Кажется достаточно простым, поэтому я создал файл с интересующими меня названиями пакетов, например
packages.txt:
ggvis
glmnet
caret
R-скрипт под названием installPkgs.R:
f = read.csv('packages.txt', header=FALSE)
z = install.packages(f[,1], repos='https://cran.rstudio.com')
И тогда я смогу запустить это из командной строки:
Rscript installPkgs.R
Когда я это делаю, пакеты загружаются, но не устанавливаются. Чего мне не хватает?
Комментарии:
1. Какой результат вы получаете? Вероятно, вы упускаете из виду конкретное сообщение об ошибке, которое прерывает установку. Вы установили все внешние требования пакета (они не устанавливаются автоматически)?
2. На выходе отображаются загружаемые пакеты, а затем строка, в которой указано «Загруженные двоичные пакеты находятся в /var /folders /blahblahblah . В этот момент он просто останавливается без другого вывода.
3. Я также добавил ‘dependencies = TRUE’ к вызову install.packages() — тот же результат.
4. Вы уверены, что пакеты не установлены? Это обычное сообщение, которое вы получаете при успешной установке двоичного пакета. Поскольку это двоичный файл, нет необходимости в компиляции или сложной установке.
5. Да. Я специально искал пакеты, которые еще не были установлены в моей системе. Я также добавил строку library (blah) после установки, и действительно, она выдает ошибку. Если я запускаю install.packages (‘blah’) из R или из RStudio, это работает нормально. Кажется, это просто не работает, когда я запускаю его из вызова Rscript. Основываясь на ответах, я предполагаю, что это «должно» сработать — это правильное предположение?
Ответ №1:
Отвечая на мой собственный вопрос, чтобы ответ был очевиден и не скрывался в комментариях.
В моем коде список пакетов интерпретируется как фактор, а не как символьные строки. Итак, мне нужно установить параметр в read.csv() или глобальный параметр stringsAsFactors = FALSE.
Тьфу.
Комментарии:
1. Еще одна причина использовать readr
read_csv
. Хотя я думаю, что R в последних версиях изменил stringsAsFactors по умолчанию на false.
Ответ №2:
С небольшим изменением приведенный выше код может принимать имена пакетов из командной строки:
install.packages(commandArgs(trailingOnly = TRUE), repos='https://cran.rstudio.com')
Итак, запуск:
Rscript installPkgs.R "ggvis" "glmnet" "caret"
должен быть достигнут тот же результат, что и выше, без использования текстового файла.
Комментарии:
1. Привет, добро пожаловать в Stackoverflow. Как правило, ответы стараются учитывать операционный контекст (если это правдоподобно / возможно). Ваше решение действительно работает, обходится без текстового файла (операционный контекст, возможно, упрощающий жизнь операционной системы), но не будет напрямую указывать на игнорирование stringsAsFactors как ошибки в данном случае. В любом случае, мне тоже нравится ваш подход.
Ответ №3:
Другое решение, которое даже не требует файла сценария — хороший выбор для Dockerfile и т.д.:
Rscript -e "install.packages(c('ggvis', 'glmnet', 'caret'), repos='https://cran.rstudio.com')"