Usando roxygen2 e doxygen no mesmo pacote? [fechadas]

91

Eu tenho um Rpacote que usa roxygen2. Ele contém algum Ccódigo /srce acabei de começar a trabalhar com o Doxygen. Existe alguma maneira de combinar a documentação ou integrar a compilação com o roxygen2? Alguma "prática recomendada" sobre onde colocar a Cdocumentação do código?

Pesquisar roxygen2 e doxigênio leva principalmente ao roxygen é semelhante aos resultados do doxigênio . Encontrei alguns pacotes com Doxyfiles, mas nenhuma organização consistente. Por exemplo, lme4 tem inst/doc/Doxyfilesaída para uma pasta chamada doxygenfora do lme4diretório de origem. Também existe um Doxyfile no diretório raiz do Matrix (mas em versões anteriores estava em inst. Esta documentação também é exportada fora do diretório do pacote.

Existe alguma razão para não incluir a Cdocumentação dentro de um pacote, ou por que o Doxygen é tão raramente usado em pacotes R, apesar do uso generalizado de C?

atualização: consulte a solicitação de recurso roxygen2 relacionada

Abe
fonte
8
Isso não responde à sua pergunta, mas se você usar o Rcpp, poderá usar o roxygen2 para documentar suas funções C ++ exportadas
hadley
2
Eu acho que o Doxygen não é usado em pacotes R, porque as pessoas não documentam seu código C. O código C quase nunca faz parte da API e do pacote R, portanto, as pessoas simplesmente não o documentam. Se você quiser colocar seus documentos C no pacote, basta gerar o HTML a partir de um Makefile e colocá-lo em inst /.
Gabor Csardi
1
Eu não sei o roxygen, mas talvez ele tenha alguma saída xml, como o doxygen, e você pode combiná-lo com algum xslt e criar um documento completo a partir dele.
Daniel Albuschat
Você está tentando incluir a entrada roxygen2 na saída doxyten ou o contrário?
Denise Skidmore

Respostas:

4

Eu pessoalmente uso o seguinte código em um pacote "dataManagement" que chamo em todos os meus scripts. Tem documentação e exemplos do Roxygen. Na verdade, você simplesmente chama document () e executa doxygen no código C, em src /. O documento é colocado em inst / doxygen para que seu pacote esteja pronto para CRAN.

A documentação R sendo projetada para usuários finais R não deveria olhar para o código C Eu não integrei a documentação do código C na documentação R clássica, mas provavelmente seria uma boa prática copiar a documentação C resultante como uma "vinheta" .

    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()
    }
cmbarbu
fonte
Obrigado! Acho que não percebi que a solução simples era redefinir devtools::documentpara adicionar uma chamada de sistema doxygen path/to/Doxyfile. Eu adicionei isso ao meu pacote. Também adicionei uma solicitação de recurso no repositório github roxygen2 @hadley
Abe
Portanto, pelo que entendi, a solicitação de pull para esse recurso não foi aceita . Mesmo assim, porque eu queria ter uma maneira conveniente de criar a documentação do doxygen, criei um pequeno pacote R com base no código acima.
nevrome