4

既存のパッケージを引き継いでいます。Rが関数を明示的にエクスポートする必要がある前に、パッケージは.Rdドキュメントで作成されました。

私の最初のステップは、Rd2roxygenを使用してドキュメントをroxygenに変換することでした(このパッケージを提供してくれたYihuiとHadleyに感謝します!)。

ただし、関数がエクスポートされないため、パッケージは機能しません。デフォルトですべての関数をエクスポートしたいだけです。この時点で、私の一般的なアプローチは、各関数で見つかる正規表現を識別し(##' @return適切なターゲットになる)、 ##' @exportその上の行に挿入することであるように思われます。

擬似コードの場合:

for all files in the `R/` directory{
   for each line starting in `##' @return`{ 
      insert `##' @export` in the preceeding line
}}

結果は次のようになります。

##' @return something

##' @export
##' @return something that varies with each function

関数のリストを取得してNAMESPACEに追加すると、各関数の上のroxygenコードにないdevtools::document("mypackage")場合は上書きされるため、機能しません。@export

質問:パッケージ内の各関数のroxygenドキュメントに@exportを追加する最も効率的な方法は何でしょうか?

さらに良い代替策は、それに応じて、NAMESPACEおよび解析exportmethodステートメントを解析することです。

4

1 に答える 1

4

編集:でエクスポートされた関数のみを使用し、RoxygenブロックのどこかにステートメントNAMESPACEがないと仮定すると、すべてのed関数のハッキーな解析を実行できます。@exportexport

NAMESPACE <- readLines("NAMESPACE")
exported_fns <- grep( "^export\\(", NAMESPACE, value=TRUE )
exported_fn_names <- gsub( "export\\((.*)\\)", "\\1", exported_fns )
fn_match_re <- paste("^", exported_fn_names, " ?<- ?", sep="")

for( file in list.files("./R", full.names=TRUE) ) {
  doc <- readLines( file )
  for( i in seq_along(doc) ) {
    if( any( sapply( fn_match_re, function(x) {
      length( grep( x, doc[i] ) ) > 0
      } ) ) ) {
      doc[i] <- paste( "##' @export", doc[i], sep="\n" )
    }
  }
  writeLines( doc, file )
}
于 2013-01-29T16:46:54.413 に答える