如何在包中添加roxygen @export所有函数

时间:2013-01-29 16:22:49

标签: regex r roxygen2

我正在接管现有的套餐。在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将不起作用,因为如果devtools::document("mypackage")不在每个函数上方的roxygen代码中,@export将覆盖它。

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

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

1 个答案:

答案 0 :(得分:4)

编辑:仅使用NAMESPACE中导出的函数,并假设它们的Roxygen块中某处没有@export语句,我们可以对所有export进行hacky解析ed功能:

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 )
}