У меня есть R
пакет, который использует roxygen2
. В нем есть C
код /src
, и я только начал работать с Doxygen. Есть ли способы объединить документацию или интегрировать компиляцию с roxygen2? Есть ли какие-нибудь «лучшие практики», где разместить C
документацию по коду?
Поиск в Google для roxygen2 и doxygen в основном приводит к roxygen аналогично результатам doxygen . Я нашел несколько пакетов с Doxyfiles, но без последовательной организации. Например, lme4 имеет inst/doc/Doxyfile
вывод в папку, которая называется doxygen
вне lme4
исходного каталога. Также есть Doxyfile в корневом каталоге Matrix (но в предыдущих выпусках он был внутри inst
. Эта документация также экспортируется за пределы каталога пакета.
Есть ли причина не включать C
документацию в пакет или почему Doxygen так редко используется в пакетах R, несмотря на широкое распространение C
?
обновление: см. соответствующий запрос функции roxygen2
Ответы:
Я лично использую следующий код в пакете dataManagement, который я вызываю во всех своих сценариях. Там есть документация по roxygen и примеры. На самом деле вы просто вызываете document () и doxygen запускает код C в src /. Документ помещается в inst / doxygen, чтобы ваш пакет был готов к работе с CRAN.
Документация R разрабатывалась для конечных пользователей 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() }
источник
devtools::document
чтобы добавить системный вызовdoxygen path/to/Doxyfile
. Я добавил это в свой пакет. Я также добавил запрос функции в репозиторий roxygen2 на github @hadley