在同一个包上使用roxygen2和doxygen?
我有一个使用roxygen2
的R
包。 它在/src
有一些C
代码,我刚刚开始与Doxygen合作。 有什么方法可以合并文档,或者将编译与roxygen2集成吗? 哪里可以放置C
代码文档的任何“最佳实践”?
谷歌searchroxygen2和doxygen主要导致roxygen是类似于doxygen的结果。 我用Doxyfilesfind了一些软件包,但没有一致的组织。 例如,lme4将inst/doc/Doxyfile
输出到lme4
源目录之外的名为doxygen
的文件夹。 Matrix的根目录中还有一个Doxyfile(但是在以前的版本中是在inst
,这个文档也被导出到软件包目录之外。
是否有任何理由不将C
文档包含在软件包中,或者为什么Doxgen在R软件包中很less使用,尽pipe广泛使用C
?
更新:请参阅相关的roxygen2function请求
我个人在我的所有脚本中调用的“dataManagement”包中使用下面的代码。 它有roxygen文件和例子。 你实际上只需要调用document(),并在src /中的C代码上运行doxygen。 文档放在inst / doxygen中,以便您的软件包已经准备好了。
为R terminal用户devise的R文档不应该查看C代码,我没有将C代码文档集成到经典的R文档中,但是将结果C文档复制为“小插曲”可能是一个好习惯, 。
library("testthat") library("devtools") #' @title Replace a value for a given tag on file in memory #' @description Scan the lines and change the value for the named tag if one line has this tag, #' add a line at the end if no line has this tag and return a warning if several lines #' matching the tag #' @param fileStrings A vector with each string containing a line of the file #' @param tag The tag to be searched for #' @param newVal The new value for the tag #' @return The vector of strings with the new value #' @examples #' fakeFileStrings <- c("Hello = world","SURE\t= indeed","Hello = you") #' #' expect_warning(ReplaceTag(fakeFileStrings,"Hello","me")) #' #' newFake <- ReplaceTag(fakeFileStrings,"SURE","me") #' expect_equal(length(newFake), length(fakeFileStrings)) #' expect_equal(length(grep("SURE",newFake)), 1) #' expect_equal(length(grep("me",newFake)), 1) #' #' newFake <- ReplaceTag(fakeFileStrings,"Bouh","frightened?") #' expect_equal(length(newFake), length(fakeFileStrings)+1) #' expect_equal(length(grep("Bouh",newFake)), 1) #' expect_equal(length(grep("frightened?",newFake)), 1) ReplaceTag <- function(fileStrings,tag,newVal){ iLine <- grep(paste0("^",tag,"\\>"),fileStrings) nLines <- length(iLine) if(nLines == 0){ line <- paste0(tag,"\t= ",newVal) iLine <- length(fileStrings)+1 }else if (nLines > 0){ line <- gsub("=.*",paste0("= ",newVal),fileStrings[iLine]) if(nLines >1){ warning(paste0("File has",nLines,"for key",tag,"check it up manually")) } } fileStrings[iLine] <- line return(fileStrings) } #' Prepares the R package structure for use with doxygen #' @description Makes a configuration file in inst/doxygen #' and set a few options: #' \itemize{ #' \item{EXTRACT_ALL = YES} #' \item{INPUT = src/} #' \item{OUTPUT_DIRECTORY = inst/doxygen/} #' } #' @param rootFolder The root of the R package #' @return NULL #' @examples #' \dontrun{ #' DoxInit() #' } #' @export DoxInit <- function(rootFolder="."){ doxyFileName <- "Doxyfile" initFolder <- getwd() if(rootFolder != "."){ setwd(rootFolder) } rootFileYes <- length(grep("DESCRIPTION",dir()))>0 # prepare the doxygen folder doxDir <- "inst/doxygen" if(!file.exists(doxDir)){ dir.create(doxDir,recursive=TRUE) } setwd(doxDir) # prepare the doxygen configuration file system(paste0("doxygen -g ",doxyFileName)) doxyfile <- readLines("Doxyfile") doxyfile <- ReplaceTag(doxyfile,"EXTRACT_ALL","YES") doxyfile <- ReplaceTag(doxyfile,"INPUT","src/") doxyfile <- ReplaceTag(doxyfile,"OUTPUT_DIRECTORY","inst/doxygen/") cat(doxyfile,file=doxyFileName,sep="\n") setwd(initFolder) return(NULL) } #' devtools document function when using doxygen #' @description Overwrites devtools::document() to include the treatment of #' doxygen documentation in src/ #' @param doxygen A boolean: should doxygen be ran on documents in src? #' the default is TRUE if a src folder exist and FALSE if not #' @return The value returned by devtools::document() #' @example #' \dontrun{ #' document() #' } #' @export document <- function(doxygen=file.exists("src")){ if(doxygen){ doxyFileName<-"inst/doxygen/Doxyfile" if(!file.exists(doxyFileName)){ DoxInit() } system(paste("doxygen",doxyFileName)) } devtools::document() }