r语言 - 针织文档中的Roxygen2文档



假设一个带有代码块的针织(rnw)文件

<<function, include=FALSE>>=
#' A simple function
#'
#' @param foo Variable foo.
#' @param bar Variable bar. 
#'
#' @return The product of foo and bar
product<-function(foo, bar) {
   return(foo*bar)
}
@

现在假设您想编译文档,并在生成的pdf中以类似于Rd文件的样式包含函数文档。这可能吗?

根据@Yihui的提示,我制定了下面的解决方案,您可以根据需要重新定义latex命令,并将rd2latex=作为一个选项。使用氧合的hack可以适当地做得更好。

documentclass{article}
usepackage{framed}
% Redefine latex commands for Rd output
usepackage{ifthen}
usepackage{verbatim}
newcommand{HeaderA}[3]{}
newcommand{code}[1]{texttt{#1}:}
%newenvironment{Description}{iffalse}{fi}
newenvironment{Description}%
        {%
            ifthenelse{isundefined{showtodos}}%
                    {expandaftercomment}%
                    {}%
                    }%
         {%
            ifthenelse{isundefined{showtodos}}%
                    {expandafterendcomment}%
                    {}%
          }
newenvironment{Usage}{}{}
newenvironment{Arguments}{}{}
newenvironment{Value}{Returns:}{}
newenvironment{ldescription}{begin{itemize}}{end{itemize}}
parindent0pt
begin{document}
<<ini, include=FALSE>>=
library(tools)
library(roxygen2)
library(knitr)
knit_hooks$set(rd2latex = function(before, options, envir) {
    if (before) {
      # hack: to run roxygenise() folders man, R and a DESC file must be created
      basePath <- normalizePath(".")
      manPath <- file.path(basePath, "man")
      rPath <- file.path(basePath, "R")
      fileConn<-file("DESCRIPTION")
      writeLines("Package: tmp", fileConn)
      close(fileConn)
      dir.create(rPath, recursive = TRUE, showWarnings = FALSE)
      # save code to an R file
      fName<-paste0("chunk_",options$label)
      fileConn<-file(paste0("R/",fName,".R") )
      writeLines(options$code, fileConn)
      close(fileConn)
      # generate Rd file
      roxygenise()
      rdFiles <- list.files("man",full.names = TRUE)
      # convert to a latex file which can be included using input{}
      if (options$rd2latex==TRUE) Rd2latex(rdFiles,out=paste0(fName,".tex"))
      else Rd2latex(rdFiles,out=paste0(options$rd2latex,".tex"))
      # remove working files
      unlink(c(manPath,rPath,"DESCRIPTION"), recursive = TRUE, force = TRUE)
    }
})
@
subsection*{Testing}
<<function, include=FALSE, rd2latex='product'>>=
#' A simple function
#'
#' @param foo Variable foo.
#' @param bar Variable bar.
#'
#' @return The product of foo and bar
product<-function(foo, bar) {
   return(foo*bar)
}
@
A simple product function is:
begin{framed}
input{product.tex}
end{framed}
end{document}

相关内容

  • 没有找到相关文章

最新更新