R - эквивалент замораживания pip (как установить все зависимости R из файла со списком имен и версий пакетов)

Я работаю над новым проектом, в котором есть код R с множеством зависимостей и определенная версия R (3.1.1). Когда они изначально писали код, они использовали install.package('the-package') R для загрузки самой последней версии, однако теперь многие зависимости имеют новые версии, которые делают их несовместимыми с используемой версией R (самые новые версии некоторых пакетов, например dplyr, rcpp, потребуют Обновление R, которое невозможно)

Судя по этому опыту, у R кажется, что у него худший менеджер пакетов — я исхожу из NPM, где вы указываете каждый пакет и конкретную версию необходимого пакета. Разрешить эти зависимости вручную — огромная проблема (уходит более 5 часов), потому что, по-видимому, поведение по умолчанию — всегда загружать последнюю версию любого пакета. До сих пор я был относительно успешным, щелкнув ссылку «старые источники» на странице CRAN для пакета, загрузив tar-файлы, а затем установив их ... Но это кажется ненужной болью. Член моей команды подписался на это руководство, чтобы получить список всех зависимостей и версий, которые мне нужны (это, по крайней мере, дает мне возможность установить все пакеты заранее, а затем продолжить методом проб и ошибок, а не разрешать более 50 зависимостей по отдельности для каждой время, когда сборка завершается сбоем в моей новой среде).. но нет команды «R, обработать мой файл зависимостей».

  • Javascript — вы используете NPM для установки из package.json.
  • Python - вы можете сделать pip freeze и pip install pip_freeze.txt, та же концепция
  • R - насколько я могу судить, нет простого способа загрузить именно то, что вам нужно, если у вас есть особые потребности, как у меня.

Это сценарий оболочки, который легко изменить для загрузки определенной версии пакета.

#!/bin/bash
# CRAN doesn't have a version of this installable in our old R.
wget -P /tmp https://cran.r-project.org/src/contrib/Archive/Rcpp/Rcpp_0.12.5.tar.gz || { echo 'wget failed'; exit 1; }
Rscript -e "install.packages('/tmp/Rcpp_0.12.5.tar.gz', repos = NULL, type='source')" 2>&1 | tee -a rPkgInstall.log
 if egrep "non-zero exit status|Error in install.packages|^package .* is not available" rPkgInstall.log; then
    echo 'FAILED';
    exit 1;
fi

Как я могу упростить этот процесс для следующего человека, который присоединится к команде? Документация может иметь большое значение, но то, что я ищу, - это функциональный менеджер пакетов в R... Или соглашение, которое позволяет мне делать то же самое, что и NPM install (from a package.json) в R.


person J-Dizzle    schedule 08.08.2016    source источник
comment
пойдите проверьте пакет контрольной точки. Это позволит вам вернуться во времени в определенный день, начавшийся в конце 2014 года, и получить все пакеты в их текущих версиях на CRAN.   -  person AlexR    schedule 09.08.2016


Ответы (4)


Пакет packrat должен подойти для вашего варианта использования. Если вы используете RStudio, я предлагаю использовать инструмент Packrat, встроенный в пользовательский интерфейс, но вы также можете использовать его отдельно от RStudio. Из пошагового руководства по Packrat:

## Install the package from CRAN
install.packages("packrat")

## Initialize packrat
packrat::init("~/path/to/your/project")

## Later on, install some package
## It will be installed in ~/path/to/your/project/packrat/lib
install.packages("reshape2")

## Take a snapshot of installed packages
packrat::snapshot()

Я, вероятно, только наполовину описываю ручной процесс. Я когда-либо использовал только автоматический режим в RStudio. Я установил его после запуска проекта, и он просмотрел мой код, сумел вытащить все необходимые пакеты (не уверен в версиях, так как я всегда на переднем крае), сохранил исходные файлы и установил их в мой проект. каталог. Затем я смог переместить каталог packrat на другую машину и установить все пакеты.

person dnlbrky    schedule 19.08.2016

Для этого есть пакет Python: https://github.com/chinmayshah99/r_freeze. Применение:

pip install r_freeze

Для печати названия пакетов:

r_freeze .

Для создания файла требований:

r_freeze -o req.txt .

Для создания требований в виде сценария R:

r_freeze -o req.R .

Для перезаписи файла требований:

r_freeze -o req.R --overwrite .

PS. Я написал этот пакет из-за своего разочарования тем, что для R не существует такого сервиса, когда мне самому пришлось генерировать эти требования из огромного проекта.

person Chinmay Shah    schedule 03.10.2020

Я думаю, это должно решить вашу проблему

pkgLoad <- function( packages = "favourites" ) {
  
  if( length( packages ) == 1L && packages == "favourites" ) {
    packages <- c( "data.table", "chron", "plyr", "dplyr", "shiny",
                   "shinyjs", "parallel", "devtools", "doMC", "utils",
                   "stats", "microbenchmark", "ggplot2", "readxl",
                   "feather", "googlesheets", "readr", "DT", "knitr",
                   "rmarkdown", "Rcpp"
    )
  }
  
  packagecheck <- match( packages, utils::installed.packages()[,1] )
  
  packagestoinstall <- packages[ is.na( packagecheck ) ]
  
  if( length( packagestoinstall ) > 0L ) {
    utils::install.packages( packagestoinstall,
                             repos = "http://cran.csiro.au"
    )
  } else {
    print( "All requested packages already installed" )
  }
  
  for( package in packages ) {
    suppressPackageStartupMessages(
      library( package, character.only = TRUE, quietly = TRUE )
    )
  }
  
}

## call the function
pkgLoad()
person Zatch Lin    schedule 20.09.2020

Как предлагается на этой странице, вы можете использовать моментальный снимок библиотеки заданная дата (например, Microsoft хранит их с 2014 года), то есть проходит, например. repos='https://cran.microsoft.com/snapshot/2016-08-06/' до install.packages или devtools::install.

person Valentas    schedule 04.11.2020