Установка пакета в автономном режиме с 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")

Но сначала вам нужно установить все зависимости.