Sử dụng roxygen2 và doxygen trên cùng một gói? [đóng cửa]


91

Tôi có một Rgói sử dụng roxygen2. Nó có một số C/srcvà tôi mới bắt đầu làm việc với Doxygen. Có bất kỳ cách nào để kết hợp tài liệu hoặc tích hợp biên dịch với roxygen2 không? Bất kỳ "phương pháp hay nhất" nào để đặt Ctài liệu mã ở đâu?

Googling cho roxygen2 và doxygen chủ yếu dẫn đến roxygen tương tự như kết quả doxygen . Tôi đã tìm thấy một vài gói với Doxyfiles, nhưng không có tổ chức nhất quán. Ví dụ: lme4 có inst/doc/Doxyfileđầu ra cho một thư mục được gọi là doxygenbên ngoài thư mục lme4nguồn. Ngoài ra còn có một Doxyfile trong thư mục gốc của Matrix (nhưng trong các bản phát hành trước đã ở trong inst. Tài liệu này cũng được xuất ra bên ngoài thư mục gói.

Có lý do gì để không bao gồm Ctài liệu bên trong một gói, hoặc tại sao Doxygen không thường xuyên được sử dụng trong các gói R, mặc dù được sử dụng rộng rãi C?

cập nhật: xem yêu cầu tính năng roxygen2 liên quan


8
Này không trả lời câu hỏi của bạn, nhưng nếu bạn sử dụng Rcpp bạn có thể sử dụng roxygen2 tài liệu C xuất khẩu của bạn ++ chức năng
hadley

2
Tôi đoán Doxygen không được sử dụng trong các gói R, vì mọi người không ghi lại mã C của họ. Mã C hầu như không bao giờ là một phần của API và gói R cung cấp, vì vậy mọi người chỉ không ghi lại nó. Nếu bạn muốn đặt tài liệu C của mình trong gói, chỉ cần tạo HTML từ Makefile và đặt nó vào inst /.
Gabor Csardi

1
Tôi không biết roxygen, nhưng có thể nó có một số đầu ra xml, như doxygen có, và bạn có thể kết hợp nó với một số xslt và tạo một tài liệu hoàn chỉnh từ đó.
Daniel Albuschat

Bạn đang cố đưa đầu vào roxygen2 vào đầu ra doxyten hay ngược lại?
Denise Skidmore

Câu trả lời:


4

Cá nhân tôi sử dụng mã sau trong gói "dataManagement" mà tôi gọi trong tất cả các tập lệnh của mình. Nó có tài liệu và ví dụ về roxygen. Bạn thực sự chỉ cần gọi document () và có doxygen chạy trên mã C, trong src /. Tài liệu được đưa vào inst / doxygen Để gói của bạn đã sẵn sàng CRAN.

Tài liệu R được thiết kế cho người dùng cuối R không được phép nhìn vào mã C Tôi đã không tích hợp tài liệu mã C trong tài liệu R cổ điển nhưng có lẽ sẽ là một phương pháp hay để sao chép tài liệu C kết quả dưới dạng "họa tiết" .

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

Cảm ơn! Tôi đoán rằng tôi đã không nhận ra rằng giải pháp đơn giản là xác định devtools::documentlại để thêm một lệnh gọi hệ thống vào doxygen path/to/Doxyfile. Tôi đã thêm cái này vào gói của mình. Tôi cũng đã thêm một yêu cầu tính năng trong kho lưu trữ roxygen2 github @hadley
Abe

Vì vậy, theo như tôi hiểu, yêu cầu kéo cho tính năng này không được chấp nhận . Bởi vì tôi muốn có một cách thuận tiện để tạo tài liệu doxygen, tôi đã tạo một gói R nhỏ dựa trên đoạn mã trên.
nevrome
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.