Как быстро реплицировать/обновлять локальную библиотеку в $ R_LIBS_USER?

Предположим, что

  1. версия RI установлена на 3.3.1;
  2. моя переменная среды $R_LIBS_USER установлена в $HOME/my/R_lib/%V; а также
  3. У меня есть каталог $HOME/my/R_lib/3.3.1 содержащий большое количество пакетов, которые я установил с течением времени.

Теперь я хочу обновить мою версию R, до 3.4.1, скажем.

Я ищу удобный способ установки новой коллекции пакетов в новом каталоге $HOME/my/R_lib/3.4.1 который является "эквивалентом версии 3.4.1" библиотеки, которую я сейчас имею под $HOME/my/R_lib/3.3.1.

(IOW, я ищу функциональность, похожую на ту, что можно сделать с опцией "замораживание" программы Python pip, которая, по сути, создает ввод, который должен был дать установщику в будущем для воспроизведения текущей установки.)

Ответы

Ответ 1

Для этой цели вы можете использовать функцию installed.packages. А именно:

installed.packages(lib.loc = "$HOME/my/R_lib/3.3.1")

Возвращаемый объект содержит много информации (большинство полей из каждого пакета DESCRIPTION файл), но имена пакетов находятся в первом столбце. Итак, что-то вроде следующего должно сделать трюк:

inst <- installed.packages(lib.loc = "$HOME/my/R_lib/3.3.1")
install.packages(inst[,1], lib="$HOME/my/R_lib/3.4.1", dependencies=FALSE)

Чтобы ответить на дополнительный вопрос в комментариях:

Если ваша старая библиотека содержала пакеты из других источников, кроме CRAN, вам нужно будет сделать какую-то гимнастику на основе содержимого файлов DESCRIPTION и, следовательно, будет зависеть от того, насколько хорошо автор пакета задокументировал ее.
field аргумента в файлах installed.packages позволяет вам выбрать дополнительные поля из этих файлов. Областями интереса для определения источника пакета являются поля Repository, URL и Maintainer. Вот несколько идей о том, как их разделить:

CRAN vs non-CRAN:

inst <- installed.packages(lib.loc = "$HOME/my/R_lib/3.3.1", 
                           fields=c("URL","Repository","Maintainer"))
inst <- as.data.frame(inst, row.names=NA, stringsAsFactors=FALSE)
cran <- inst[inst$Repository%in%"CRAN",]
non_cran <- inst[!inst$Repository%in%"CRAN" & !inst$Priority%in%"base",]

Пакеты биокондукторов:

bioc <- inst[grepl("Bioconductor",inst$Maintainer),]
source("https://bioconductor.org/biocLite.R")
biocLite(pkgs=bioc$Packages)

Пакеты Github:

git <- non_cran[grepl("github", non_cran$URL),]
install.packages("devtools")
library(devtools)
for(i in seq(nrow(git))){
    install_github(repo=gsub("http://github.com/","",git$URL[i]))
}