Usi roxygen2 e doxygen sulla stessa confezione? [chiuso]


91

Ho un Rpacchetto che utilizza roxygen2. Ha del Ccodice /srce ho appena iniziato a lavorare con Doxygen. Esistono modi per combinare la documentazione o integrare la compilazione con roxygen2? Qualche "best practice" per dove mettere la Cdocumentazione del codice?

Googling per roxygen2 e doxygen porta principalmente a roxygen è simile ai risultati di doxygen . Ho trovato alcuni pacchetti con Doxyfiles, ma nessuna organizzazione coerente. Ad esempio, lme4 ha l' inst/doc/Doxyfileoutput in una cartella chiamata doxygenal di fuori della lme4directory di origine. C'è anche un Doxyfile nella directory root di Matrix (ma nelle versioni precedenti era presente inst. Anche questa documentazione viene esportata fuori dalla directory del pacchetto.

C'è qualche ragione per non includere la Cdocumentazione all'interno di un pacchetto, o perché Doxygen è usato così raramente all'interno dei pacchetti R, nonostante l'uso diffuso di C?

aggiornamento: vedere la relativa richiesta di funzionalità roxygen2


8
Questo non risponde alla tua domanda, ma se usi Rcpp puoi usare roxygen2 per documentare le tue funzioni C ++ esportate
hadley

2
Immagino che Doxygen non sia usato nei pacchetti R, perché le persone non documentano il loro codice C. Il codice C non fa quasi mai parte dell'API e il pacchetto R fornisce, quindi le persone semplicemente non lo documentano. Se vuoi mettere i tuoi documenti C nel pacchetto, genera semplicemente l'HTML da un Makefile e mettilo in inst /.
Gabor Csardi

1
Non conosco roxygen, ma forse ha un output xml, come doxygen, e puoi combinarlo con un xslt e creare un documento completo da quello.
Daniel Albuschat

Stai cercando di includere l'input roxygen2 nell'output di doxyten o viceversa?
Denise Skidmore

Risposte:


4

Personalmente utilizzo il codice seguente in un pacchetto "dataManagement" che chiamo in tutti i miei script. Ha documentazione ed esempi di roxygen. In realtà chiami semplicemente document () e fai girare doxygen sul codice C, in src /. Il documento viene inserito in inst / doxygen in modo che il pacchetto sia pronto per CRAN.

La documentazione R è stata progettata per gli utenti finali R che non dovrebbero guardare il codice C Non ho integrato la documentazione del codice C nella documentazione R classica ma probabilmente sarebbe una buona pratica copiare la documentazione C risultante come una "vignetta" .

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

Grazie! Immagino di non essermi reso conto che la soluzione semplice fosse ridefinire devtools::documentper aggiungere una chiamata di sistema a doxygen path/to/Doxyfile. L'ho aggiunto al mio pacchetto. Ho anche aggiunto una richiesta di funzionalità nel repository github roxygen2 @hadley
Abe

Quindi, per quanto ho capito, la richiesta di pull per questa funzione non è stata accettata . Poiché tuttavia volevo avere un modo conveniente per creare documentazione doxygen, ho creato un piccolo pacchetto R basato sul codice sopra.
nevrome
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.