2

OSに依存しない方法でローカルリポジトリのルートディレクトリへのURLのようなパスを指定して、パッケージバイナリ(またはLinuxおよびMac OSで同等のものと呼ばれるもの)を含む実際のサブディレクトリへのパスを拡張する関数はありますか?

デューデリジェンス

関連リンク

次の下にリポジトリがあるとします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そのためには、バイナリと2つのインデックスファイル( PACKAGES.gz`)を含む実際のディレクトリへのパスを取得する必要があると思います。そして、それを可能な限り一般的なものにするために、 OSに依存しない方法でそれを行う必要があります。

もちろん、インデックスファイルを検索することもできます

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 に答える