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

问题:将 @export 添加到包中每个函数的 roxygen 文档中的最有效方法是什么?

一个更好的选择是相应地解析NAMESPACE和解析exportmethod语句。

4

1 回答 1

4

编辑:仅使用导出的函数,并假设它们在 Roxygen 块中NAMESPACE的某处没有语句,我们可以对所有ed 函数进行 hacky 解析:@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 回答