Разверните путь к фактическому подкаталогу, содержащему пакеты для локальных репозиториев
Существует ли функция, которая расширяет путь к фактическому подкаталогу, содержащему двоичные файлы пакета (или как там называется эквивалент в 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"
Есть другие идеи?