Установка пакета в автономном режиме с GitHub
Я пытаюсь перенести некоторые пакеты в установку R на автономном (Windows) компьютере.
Из CRAN (скажем, data.table
), процесс: 1) скачать .zip на отдельный онлайн-компьютер; 2) флэш-накопитель → автономный компьютер; 3) установить через install.packages("....zip"...)
работает точно так, как ожидалось.
Однако, этот процесс сломался, когда я попытался установить его из GitHub.
Когда я запускаю install.packages
(примечание: я использую type="binary"
и repos=NULL
; type="win.binary"
ничего не делает) либо в zip файле (полученном, перейдя на страницу пакета, например https://github.com/Rdatatable/data.table и используя функцию "Загрузить .zip" ), что-то пошло не так.
Нет сообщения об ошибке (и ничего нового в настройке verbose=TRUE
), и папка пакета добавлена в мою библиотеку (т.е. я вижу папку с именем "data.table-master", когда я перемещаюсь туда), но library(data.table)
приводит к ошибке: "нет пакета с именем data.table
". Я также заметил, что, пока установка из CRAN заканчивается успешно упакованным пакетом data.table
и проверяется сумма MD5 ", я не получаю такого сообщения от попытки установки GitHub.
Что здесь происходит? Я пробовал все возможные варианты в ?install.packages
, но, учитывая, что я действительно не получаю сообщение об ошибке, было трудно определить, в чем проблема.
Больше фона: версия R - 3.2.0. Трудно скопировать-вставить sessionInfo
, так как этот компьютер не подключен к сети, не уверен, что еще может быть актуальным.
Update:
Учитывая комментарии @r2evans ниже, я также попытался использовать type="source"
с install.packages
, и это тоже не сработало (такая же проблема - несмотря на наличие папки "data.table-master" в одном из моих .libPaths()
, library(data.table)
дает ошибку, что там нет такого пакета).
На этот раз я получил еще несколько результатов от использования verbose=TRUE
:
system (cmd0): C:/PROGRA~1/R/R-32~1.0/bin/x64/R CMD INSTALL
1): выполнено 'C:/PROGRA~1/R/R-32~1.0/bin/x64/R CMD INSTALL -l "C:\Users\Mike\Documents\R\win-library\3.2" "E:/data.table-master.zip"'
Ответы
Ответ 1
Предположим, что у вас есть Rtools и devtools на win-машине.
Шаг 1: Загрузите исходный zip.
Шаг 2: Скопируйте на машину выигрышей и разархивируйте там содержимое.
Шаг 3: Запустите следующий код (при необходимости отрегулируйте путь):
library(devtools)
source <- devtools:::source_pkg("E:/temp/data.table-master")
install(source)
library(data.table)
#loads 1.9.7
Ответ 2
Не уверен, что это решение или обходной путь. Учитывая zip файл источника структуры каталога пакета R:
В оболочке:
~$ unzip data.table-master.zip
## optional renaming
~$ mv data.table-master data.table
## create the new
~$ tar czf data.table.tar.gz data.table
Есть, вероятно, другие инструменты, которые позволят вам извлекать и переархивировать их в другом формате. Поскольку я склонен к доступу и контролю на уровне оболочки, я склоняюсь к этим простым инструментам.
В R:
install.packages("data.table.tar.gz", type="source", repos=NULL)
(Это не удастся, если все зависимости уже не установлены.)
Ответ 3
Итак, я наконец-то придумал обходное решение, которое работает в некоторых случаях... но это, по общему признанию, немного macgyvered. Хотелось бы услышать некоторые отзывы о том, как сделать этот подход работать для любого пакета.
Поскольку у меня есть пакет, где весь код находится в одном .R файле, я подделал пакетную среду для этого пакета и использовал функции в этой среде. Предположим, что пакет находится в test.R
:
#add an appropriately named package to the search() path
attach(environment(), name = "package:pkg")
#source the functions
sys.source("test.R", envir = as.environment("package:pkg"))
Voila. Я не знаю, как загружаются пакеты, чтобы сказать, как это сделать, например, если пакет имеет код src
на C или что-то еще.
Ответ 4
Следующая функция извлекает файл GitHub .zip
, расположенный в path
во временный каталог, и устанавливает пакет прямо оттуда, то есть не создает промежуточный архив .tar.gz
. Функция пытается угадать имя пакета, но его также можно передать через pkg
. Временные файлы удаляются при выходе.
Эта функция не устанавливает никаких зависимостей.
install_zip <- function(path,
pkg = sub("(-[^-]+)?\\.[^.]+$", "", basename(path))) {
dir1 <- tempfile()
dir2 <- file.path(dir1, pkg)
dir.create(dir2, recursive = TRUE)
on.exit(unlink(dir1, recursive = TRUE, force = TRUE))
suppressMessages(unzip(path, exdir = dir2,
unzip = getOption("unzip")))
temp_contents <- dir(dir2)
if (length(temp_contents) == 1L) {
dir3 <- file.path(dir2, temp_contents)
if (file.info(dir3, extra_cols=FALSE)[["isdir"]]) {
dir2 <- file.path(dir2, pkg)
file.rename(dir3, dir2)
}
}
install.packages(dir2, repos = NULL, type = "source")
}
Ответ 5
Вы можете использовать install_local
из devtools
для установки пакета Github с загруженным zip файлом, например.
library("devtools")
install_local(path = "data.table-master.zip")
Но сначала вам нужно установить все зависимости.