Загружать только источники пакета и все зависимости
Мне интересно, есть ли способ использовать 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()
).