Разверните путь к фактическому подкаталогу, содержащему пакеты для локальных репозиториев

Существует ли функция, которая расширяет путь к фактическому подкаталогу, содержащему двоичные файлы пакета (или как там называется эквивалент в Linux и Mac OS), учитывая URL-подобный путь к корневому каталогу локального репозитория независимым от ОС образом?

Due Dilligence

Ссылки по теме

Предположим, у вас есть хранилище под L:/my_repo:

path.repo <- "L:/my_repo"

MS Windows требует определенной структуры подкаталогов:

path.sub  <- file.path("bin/windows/contrib", paste(version$major, 
    gsub("(?<=\\d)\\.\\d", "", version$minor, perl=TRUE), sep=".")
)

Собственно создайте репозиторий:

dir.create(file.path(path.repo, path.sub), recursive=TRUE, showWarnings=FALSE)

Как только двоичный пакет существует в хранилище, необходимо создать индекс хранилища:

setwd(file.path(path.repo, path.sub))
tools::write_PACKAGES(".", type="win.binary")

После этого репозиторий готов к работе, и вы можете установить его пакеты через

install.packages("mypackage", repos=file.path("file://", path.repo))

Все идет нормально. Я хотел бы создать функцию, которая автоматически копирует двоичный файл пакета в мой локальный репозиторий после того, как двоичный файл пакета был собран. Для этого, я думаю, мне нужно получить путь к фактическому каталогу, содержащему двоичные файлы и два индексных файла (PACKAGES' and PACKAGES.gz`). И это должно происходить независимым от ОС образом, чтобы сделать его как можно более общим.

Конечно, я мог искать индексные файлы через

unique(dirname(grep("PACKAGE*", list.files(path.repo, recursive=TRUE, 
    full.names=TRUE), value=TRUE)))

Но мне интересно, есть ли лучший способ.

1 ответ

Решение

Это то, что я дошел до сих пор. Это заимствует из кода в contrib.url():

expandPathRepos=function(
    path,
    type="win.binary",
    vsn=paste(version$major, gsub("(?<=\\d)\\.\\d", "", 
        version$minor, perl=TRUE), sep="."), 
    ...
) {
    if (!type %in% c("source", "mac.binary", "win.binary")) {
        stop(paste("Invalid type: '", type, "'", sep=""))
    }
    out <- switch(unlist(type), 
        source=paste(gsub("/$", "", path), 
            "src", "contrib", sep = "/"), 
        mac.binary=paste(gsub("/$", "", path), "bin", "macosx", 
            mac.subtype, "contrib", ver, sep="/"), 
        win.binary=paste(gsub("/$", "", path), 
            "bin", "windows", "contrib", vsn, sep = "/")
    )
    return(out)
}

expandPathRepos(path="L:/R")
[1] "L:/R/bin/windows/contrib/2.14"

Есть другие идеи?

Другие вопросы по тегам