#r #rscript
#r #rscript
Вопрос:
Когда вы пытаетесь установить пакет в R и у вас нет прав доступа к пути к библиотеке по умолчанию, R спросит вас:
Хотели бы вы вместо этого использовать личную библиотеку?
Хотите создать личную библиотеку ‘~/ path’ для установки пакетов?
Однако, если вы используете Rscript, эти сообщения не будут отображаться, и установка завершится неудачно. Я мог бы заранее определить конкретный путь и указать install.packages
, как его использовать, но я не хочу создавать дополнительный путь к библиотеке, который был бы специфичен для этого Rscript. Я просто хочу использовать личную библиотеку по умолчанию. Есть ли способ принудительно создать личную библиотеку, не требуя взаимодействия?
Комментарии:
1. Обновление
.libPaths()
?2. Вы должны полностью прочитать
help(".libPaths")
, на что ссылается справкаinstall.packages
. «Путь поиска библиотеки инициализируется при запуске из переменной средыR_LIBS
(которая должна быть списком каталогов, разделенных двоеточием, в которых корневые деревья библиотек R), за которыми следуют каталоги в переменной средыR_LIBS_USER
. Будут включены только те каталоги, которые существуют на данный момент. По умолчаниюR_LIBS
значение не задано иR_LIBS_USER
устанавливается в каталог‘R/R.version$platform-library/x.y’
домашнего каталога (или‘Library/R/x.y/library’
для сборок CRAN OS X), для R x.y.z.`3. (не хватает места) Сказав это, я не большой поклонник скрипта анализа, который фактически устанавливает пакеты. Я также могу быть в меньшинстве, а также быть компульсивно подозрительным специалистом по кибербезопасности, но я бы предпочел, чтобы был скрипт установки pkg, который я запускаю вручную, или предполетная проверка в скрипте, который затем сообщает мне, чего мне не хватает, особенно если сценарий основан на более старой или более новой версиипакет, и я использую определенную версию по какой-то причине.
4. Хорошо иметь сценарий установки, который запускается заранее в отдельном контексте, чем сценарий анализа. Но если этот сценарий установки сам по себе полностью автоматизирован, должен быть простой способ установить пользовательские (некорневые) пакеты без необходимости какого-либо ручного взаимодействия. Например
pip
, имеет тривиальныйuser
флаг, который можно передать, чтобы указать ему использовать домашний каталог текущего пользователя вместо системного каталога.install.packages
уже имеет функциональность для этого и определяет, куда должны идти пользовательские пакеты. У него должен бытьuser
необязательный аргумент, который я могу установитьTRUE
.5. Я не согласен с предположением, что R-скрипты обязательно являются сценариями анализа. Я думаю, что есть много ситуаций, когда мы можем захотеть написать сценарий инициализации на R, который обрабатывает зависимости
Ответ №1:
Вы можете использовать Sys.getenv("R_LIBS_USER")
для получения местоположения поиска локальной библиотеки.
Это то, что я в итоге сделал, и, похоже, это работает (самой сложной частью было тестирование решения, поскольку проблема возникает только при первой попытке установки пакета):
# create local user library path (not present by default)
dir.create(path = Sys.getenv("R_LIBS_USER"), showWarnings = FALSE, recursive = TRUE)
# install to local user library path
install.packages(p, lib = Sys.getenv("R_LIBS_USER"), repos = "https://cran.rstudio.com/")
# Bioconductor version (works for both Bioconductor and CRAN packages)
BiocManager::install(p, update = FALSE, lib = Sys.getenv("R_LIBS_USER"))
Как указал @hrbrmstr в комментариях, принудительная установка пакетов может оказаться не очень хорошей идеей, поэтому используйте на свой страх и риск.
Комментарии:
1. Обратите внимание, что biocLite больше не следует использовать для установки пакетов из Bioconductor. Используйте
BiocManager::install()
2.Важно отметить: хотя вы можете установить
R_LIBS_USER
в своей среде иR
будете уважать это,Sys.getenv("R_LIBS_USER")
вернет что-то разумное, даже еслиR_LIBS_USER
оно не установлено в вашей среде.