ใช้ roxygen2 และ doxygen ในแพ็คเกจเดียวกันหรือไม่? [ปิด]


91

ฉันมีRแพ็คเกจที่ใช้roxygen2. มีCรหัสอยู่/srcและฉันเพิ่งเริ่มทำงานกับ Doxygen มีวิธีใดบ้างในการรวมเอกสารหรือรวมการคอมไพล์กับ roxygen2? "แนวทางปฏิบัติที่ดีที่สุด" สำหรับวางCเอกสารโค้ดไว้ที่ใด

Googling สำหรับ roxygen2 และ doxygen ส่วนใหญ่นำไปสู่roxygen คล้ายกับผลลัพธ์ของdoxygen ฉันพบสองสามแพ็คเกจกับ Doxyfiles แต่ไม่มีองค์กรที่สอดคล้องกัน ตัวอย่างเช่น lme4 มีinst/doc/Doxyfileเอาต์พุตไปยังโฟลเดอร์ที่เรียกว่าdoxygenภายนอกlme4ไดเร็กทอรีต้นทาง นอกจากนี้ยังมี Doxyfile ในไดเร็กทอรีรากของ Matrix (แต่ในรีลีสก่อนหน้านี้อยู่ในinstเอกสารนี้จะถูกส่งออกนอกไดเร็กทอรีแพ็กเกจด้วย

มีเหตุผลที่จะไม่รวมถึงการใด ๆCเอกสารภายในแพคเกจหรือทำไม Doxygen ใช้เพื่อบ่อยภายในแพคเกจ R แม้จะมีการใช้อย่างแพร่หลายของC?

อัปเดต:ดูคำขอคุณลักษณะ roxygen2ที่เกี่ยวข้อง


8
สิ่งนี้ไม่ตอบคำถามของคุณ แต่ถ้าคุณใช้ Rcpp คุณสามารถใช้ roxygen2 เพื่อบันทึกฟังก์ชัน C ++ ที่ส่งออกของคุณได้
hadley

2
ฉันเดาว่า Doxygen ไม่ได้ใช้ในแพ็คเกจ R เนื่องจากผู้คนไม่ได้บันทึกรหัส C ของพวกเขา รหัส C แทบจะไม่เคยเป็นส่วนหนึ่งของแพ็คเกจ API และ R ดังนั้นผู้คนจึงไม่ได้จัดทำเอกสาร หากคุณต้องการใส่เอกสาร C ของคุณในแพ็คเกจเพียงแค่สร้าง HTML จาก Makefile แล้วใส่ลงใน inst /
Gabor Csardi

1
ฉันไม่รู้จัก roxygen แต่บางทีมันอาจมีเอาต์พุต xml อย่างที่ doxygen มีและคุณสามารถรวมกับ xslt และสร้างเอกสารที่สมบูรณ์จากสิ่งนั้น
Daniel Albuschat

คุณกำลังพยายามรวมอินพุต roxygen2 ในเอาต์พุต doxyten หรือวิธีอื่น ๆ หรือไม่?
Denise Skidmore

คำตอบ:


4

ฉันใช้รหัสต่อไปนี้เป็นการส่วนตัวในแพ็คเกจ "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
Abe

ดังนั้น - เท่าที่ผมเข้าใจมันคำขอดึงสำหรับคุณลักษณะนี้ไม่ได้รับการยอมรับ เนื่องจากฉันต้องการวิธีที่สะดวกในการสร้างเอกสาร doxygen ฉันจึงสร้างแพ็คเกจ Rขนาดเล็กตามรหัสด้านบน
nevrome
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.