Загружать только исходные коды пакета и все зависимости - PullRequest
29 голосов
/ 08 июня 2011

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

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

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

Ответы [ 3 ]

38 голосов
/ 27 марта 2013

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

Скажем, я хочу, чтобы все зависимости и импорт были 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, следуйте инструкциям здесь .

17 голосов
/ 08 июня 2011

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

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

14 голосов
/ 08 июня 2011

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


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

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

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

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

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

...