Загружать только источники пакета и все зависимости

Мне интересно, есть ли способ использовать install.packages() или другие связанные функции, чтобы сделать следующее: загружать только источники (т.е. tar.gz файлы) указанных пакетов и всех их зависимостей в указанную папку (в Windows).

Одна из причин сделать это: скажем, у меня есть учетная запись Linux, которая не включена для доступа в Интернет. Чтобы установить пакеты на машине Linux, я бы сначала загрузил все необходимые источники на моем компьютере с Windows, затем передал их на компьютер Linux и установил их на машине Linux, используя

  install.packages('/home/me/R/Packages/blah.tar.gz', repos = NULL)

Ответ 1

В этом пакете инструментов теперь есть лучшие варианты, которые поставляются с базой R: package_dependencies(). См. Например, "Ответ от @sebastian-c" и этот недавний Q & A для соответствующего прецедента.


В пакете utils имеется неэкспонированная функция getDependencies(). Я не изучил, как это работает, но в сочетании с этим ответом @Dirk вы получите большую часть своего пути.

В принципе, похоже, вы используете его как:

utils:::getDependencies(pkgs, dependencies, available, lib)

где pkgs - вектор символов пакетов для установки, dependencies - символьный вектор типов зависимостей (Depends, Enhances и т.д.), которые вы хотите, available - это результат от available.packages() и lib - это расположение библиотеки для пакетов, в которых оцениваются зависимости.

Если вы отлаживаете install.packages(), в основном выполняется шаг getDependencies(), а затем @Dirk download.packages(), прежде чем он начнет что-то устанавливать.

Ответ 2

У меня недавно возникла проблема, когда я хотел загрузить все зависимости, и я решил ее таким образом:

Скажите, что мне нужны все зависимости и импорт ggplot2 и MASS:

getPackages <- function(packs){
  packages <- unlist(
    tools::package_dependencies(packs, available.packages(),
                         which=c("Depends", "Imports"), recursive=TRUE)
  )
  packages <- union(packs, packages)
  packages
}

packages <- getPackages(c("ggplot2", "MASS"))

Теперь я могу загрузить пакеты в другой каталог.

download.packages(packages, destdir="whereyouactuallywantthefiles", 
                  type="source")

Оттуда, если вы хотите сделать локальное репо на своем Linux-ПК, следуйте инструкциям здесь.

Ответ 3

Попробуйте download.packages(c("xts", "rms"), "c:/TEMP", .....) вместо install.packages(); вы можете напрямую указать ему целевой каталог во втором аргументе.

Отредактируйте несколько лет спустя: Как указано выше, на других ответах и ​​комментариях, к настоящему времени в R-инструменты и утилиты добавлены несколько вспомогательных функций. R 3.4.0 будет иметь tools::CRAN_package_db() для загрузки файла верхнего уровня PACKAGES.rds (и, конечно же, вы можете просто объединить download.file() и readRDS()).