Создание локального репозитория пакетов R
Я хотел бы создать локальный репозиторий пакетов R, чтобы пользователи в моей компании могли устанавливать пакеты из него, а системные администраторы могли периодически обновлять локальный репозиторий. Доступ к зеркалам CRAN в настоящее время запрещен.
Есть ли простой способ сделать это?
4 ответа
Да, копия CRAN или репозиторий с локальными пакетами проста в настройке. Предположительно, вы хотите это для Windows, поэтому сделайте следующее:
- Создайте каталог верхнего уровня на своем веб-сервере, скажем
R/
- Создайте там обычную иерархию:
R/bin/windows/contrib/2.11
, Если вам нужно поддерживать другие (более ранние) выпуски, просто создайте каталоги2.10
,2.9
,... сразу после2.11
каталог. Поместите нужные вам пакеты в каталог (скажем,
2.11
), затем перейдите в этот каталог и выполните следующую команду для генерацииPACKAGES
а такжеPACKAGES.gz
файлы для хранилища:tools::write_PACKAGES(".", type="win.binary")
Это все, что нужно сделать - теперь вы можете получить доступ к хранилищу, указав на адрес с помощью такой команды, как
update.packages(repos="http://my.local.server/R", ask=FALSE)
что я даже делаю в R/zzz.R
для локальных пакетов, чтобы они сами обновлялись.
Отредактируйте примерно пять с лишним лет спустя: и пакет drat теперь автоматизирует большую часть этого, и особенно хорошо, если вы также используете GitHub для обслуживания хранилища через http/https (но также полезно для другого или локального хостинга).
Пакет miniCRAN также обеспечивает отличную функциональность для этого. Основным преимуществом является то, что вам не нужно полное зеркало, но вы можете настроить "мини" зеркало CRAN только с теми пакетами, которые вам нужны, включая их зависимости.
У меня также нет доступа к зеркалам CRAN для установки пакетов. В результате, вот некоторые шаги, которые я считаю полезными.
Во-первых, вы должны убедиться, что у вас есть следующий путь и его каталоги в вашей системе: "/R/src/contrib". Если у вас нет этого пути и этих каталогов, вам нужно их создать. Все файлы ваших пакетов R будут храниться в каталоге «contrib».
После того, как вы добавили файлы пакета в каталог «contrib», вы можете использоватьsetRepositories
из пакета utils для создания репозитория. Я бы рекомендовал добавить следующий код в ваш .Rprofile для локального репозитория:
utils::setRepositories(ind = 0, addURLs = c(WORK = "file://<your higher directories>/R"))
После редактирования вашего .Rprofile перезапустите R.
ind = 0
укажет, что вам нужен только локальный репозиторий. Дополнительные репозитории могут быть включены вaddURLs =
option и разделены запятыми внутри вектора символов.
Затем создайте индекс репозитория со следующим кодом:
tools::write_PACKAGES("/<your higher directories>/R/src/contrib", verbose = TRUE)
Это создаст файлы PACKAGE, которые служат индексом репозитория.
Чтобы увидеть, какие пакеты находятся в вашем репозитории, запустите следующий код и посмотрите на результирующий фрейм данных:my_packages <- available.packages()
На этом этапе вы можете устанавливать пакеты из репозитория, не указывая полный путь к файлу установки пакета. Например, чтобы установить пакет dplyr , вы можете запустить следующее:
install.packages("dplyr", dependencies = TRUE)
Если вы хотите сделать еще один шаг вперед и управлять меняющимся репозиторием, вы можете установить и использовать пакет miniCRAN . В противном случае вам потребуется выполнитьwrite_PACKAGES
работать всякий раз, когда ваш репозиторий изменяется.
После установки пакета miniCRAN вы можете выполнить следующий код для создания репозитория miniCRAN :
my_packages <- available.packages()
miniCRAN::makeRepo(
pkgs = my_packages[,1,
path = "/<your higher directories>/R",
repos = getOption("repos"),
type = "source",
Rversion = R.version,
download = TRUE,
writePACKAGES = TRUE,
quiet = FALSE
)
Вам нужно выполнить приведенный выше код только один раз для каждого репо.
Затем убедитесь, что каждый репозиторий miniCRAN создан. Вам нужно сделать это только один раз для каждого репо:
pkgAvail(
repos = getOption("repos"),
type = "source",
Rversion = R.version,
quiet = FALSE
)
Всякий раз, когда новые файлы пакетов помещаются в локальное репо, вы можете обновить индекс локального репо следующим образом:
miniCRAN::updateRepoIndex("/<your higher directories>/R/")
Наконец, в качестве дополнительного шага, чтобы увидеть, находится ли новый пакет в индексе, создайте фрейм данных доступных пакетов и выполните поиск фрейма данных:
my_packages <- available.packages(repos = "file://<your higher directories>/R/")
Этот подход работал довольно хорошо для меня, но, возможно, у других есть комментарии и предложения, которые могли бы его улучшить.