我正在接管现有的套餐。在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
并相应地解析export
和method
语句。
答案 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 )
}