2

是否有一个函数可以将路径扩展到包含包二进制文件的实际子目录(或在 Linux 和 Mac OS 下调用的任何等效项),给定以与操作系统无关的方式到本地存储库的根目录的类似 URL 的路径?

尽职调查

相关链接

假设您在以下有一个存储库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' andPACKAGES.gz`)的实际目录的路径。这应该以独立于操作系统的方式发生,以使其尽可能通用。

当然我可以通过搜索索引文件

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

但我想知道是否有更好的方法。

4

1 回答 1

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"

还有其他想法吗?

于 2012-10-15T15:42:12.230 回答