提取R函数的参数以在knitr中使用

时间:2013-11-21 12:56:39

标签: r knitr sweave

lm函数的参数可以通过使用:

获得
args(lm)

输出

function (formula, data, subset, weights, na.action, method = "qr", 
    model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, 
    contrasts = NULL, offset, ...) 
NULL

问题

如何获得:

lm (formula, data, subset, weights, na.action, method = "qr", 
    model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, 
    contrasts = NULL, offset, ...) 

包含要在Sweaveknitr中使用的每个参数的说明(不完整的帮助)。感谢

被修改

使用@Ananda提供的funExtract功能,我非常接近我想要的结果。以下是带有输出的Rnw文件的代码。

\documentclass{article}
\usepackage[T1]{fontenc}

\begin{document}

Arguments for lm

<< label = funExtract, echo = TRUE, results = "hide", tidy = FALSE >>=
funExtract <- function(Function, section = "Usage") {
  A <- deparse(substitute(Function))
  x <- capture.output(tools:::Rd2txt(utils:::.getHelpFile(help(A))))
  B <- grep("^_", x)                    ## section start lines
  x <- gsub("_\b", "", x, fixed = TRUE) ## remove "_\b"
  X <- rep(FALSE, length(x))
  X[B] <- 1
  out <- split(x, cumsum(X))
  out <- out[[which(sapply(out, function(x) 
    grepl(section, x[1], fixed = TRUE)))]]
  cat(out, sep = "\n")
  invisible(out)
}
@

\vspace{0.5cm}\\
funExtract function output
\vspace{0.25cm}\\
<< label = lm-usage, echo = FALSE, results = "asis" >>=
funExtract(lm, section="Usage:")
@

\vspace{0.5cm}\\
args function output
\vspace{0.25cm}\\
<< label = lm-args, echo = FALSE, results = "asis" >>=
args(lm)
@


\end{document}

输出

enter image description here

funExtract函数输出问题

  1. 如何从funExtract函数获取高亮显示的输出作为其他代码?
  2. 如何删除部分标题格式funExtract函数输出?

3 个答案:

答案 0 :(得分:5)

我在 formatR 包中有一个函数usage(),用于捕获函数的参数。目前,您必须使用development version(&gt; = 0.10.3)。

对于 knitr ,我也有最近的更改(也请测试其开发版本on Github),以便您可以更轻松地使用显示功能:您可以使用新的块选项code将代码输入到块中。

将两个部分组合在一起,您就可以编写如下代码块:

<<test, code=formatR::usage(lm), eval=FALSE>>=
@

最近出现这些功能的原因是我自己也需要它们。我想用语法高亮显示函数的用法。此解决方案可移植到 knitr 支持的所有文档格式,不限于Rnw。

答案 1 :(得分:4)

我已经编写了一个函数,并在之前将其作为答案发布(如问题本身所述),但对于不一致或要求必须与“markdown”一起使用才能成功使用并不完全满意。经过一些工作后,这就是我提出的功能:

helpExtract <- function(Function, section = "Usage", type = "m_code", ...) {
  A <- deparse(substitute(Function))
  x <- capture.output(tools:::Rd2txt(utils:::.getHelpFile(help(A, ...)),
                                     options = list(sectionIndent = 0)))
  B <- grep("^_", x)                    ## section start lines
  x <- gsub("_\b", "", x, fixed = TRUE) ## remove "_\b"
  X <- rep(FALSE, length(x))
  X[B] <- 1
  out <- split(x, cumsum(X))
  out <- out[[which(sapply(out, function(x) 
    grepl(section, x[1], fixed = TRUE)))]][-c(1, 2)]
  while(TRUE) {
    out <- out[-length(out)]
    if (out[length(out)] != "") { break }
  } 

  switch(
    type,
    m_code = c("```r", out, "```"),
    s_code = c("<<>>=", out, "@"),
    m_text = paste("    ", out, collapse = "\n"),
    s_text = c("\\begin{verbatim}", out, "\\end{verbatim}"),
    stop("`type` must be either `m_code`, `s_code`, `m_text`, or `s_text`")
  )
}

非常满口,并不是完全干......但我想捕捉四种情景,这是我想到的最快的想法。我预期的四种情景是:

  1. 文档类型为markdown,用户正在提取代码块(type = "m_code"
  2. 文档类型为markdown,用户正在提取非代码部分(type = "m_text"
  3. 文档类型为Sweave,用户正在提取代码块(type = "s_code"
  4. 文档类型为Sweave,用户正在提取非代码部分(type = "s_text"
  5. 该函数提取Rd2txt的输出。我选择了其他格式(HTML,LaTeX),允许我使用单个函数来获取我想要的东西而不必创建多个函数。


    用法

    根据您是创建“Sweave”(.Rnw)还是“markdown”(.Rmd)文档,使用情况会有所不同。

    1. <强>降价

      将代码插入到看起来像这样的代码块中(也许有一天我会添加不同的方法,但现在不添加):

      ```{r, echo=FALSE, results='asis'}
      cat(helpExtract(cor), sep = "\n")
      ```
      
    2. <强> Sweave

      假设您正在使用Sexpr{knit_child(.)}

      插入应包含在主文档中的“子”文档
      \Sexpr{knit_child(textConnection(helpExtract(cor, type = "s_code")), 
      options = list(tidy = FALSE, eval = FALSE))}
      

    3. created a Gist包括函数,示例Rmd文件和示例Rnw文件。随意在Stack Overflow 上留下评论和建议(因为Gist评论几乎毫无意义,因为他们在发布评论时不会通知用户)。


      如果您尝试从当前未加载的包中引用某个函数,helpExtract的用法应该类似于:

      helpExtract(gls, package = "nlme")
      

答案 2 :(得分:2)

您可以使用Rd_db从包中获取Rd数据。

x <- Rd_db("stats")

从中提取lm帮助:

lmhelp <- x[basename(names(x))=="lm.Rd"]

然后使用capture.outputRd2latex来获取帮助页面的内容:

lmhelptex <- capture.output(Rd2latex(lmhelp[[1]]))

然后拉出要包含在rnw文件中的段:

lmhelptex[do.call(":",as.list(grep("Usage",lmhelptex)))]
[1] "\\begin{Usage}"                                                    
[2] "\\begin{verbatim}"                                                 
[3] "lm(formula, data, subset, weights, na.action,"                     
[4] "   method = \"qr\", model = TRUE, x = FALSE, y = FALSE, qr = TRUE,"
[5] "   singular.ok = TRUE, contrasts = NULL, offset, ...)"             
[6] "\\end{verbatim}"                                                   
[7] "\\end{Usage}"  

lmhelptex[do.call(":",as.list(grep("Arguments",lmhelptex)))]
 [1] "\\begin{Arguments}"                                                                           
 [2] "\\begin{ldescription}"                                                                        
 [3] "\\item[\\code{formula}] an object of class \\code{\"\\LinkA{formula}{formula}\"} (or one that"
 [4] "can be coerced to that class): a symbolic description of the"                                 
 [5] "model to be fitted.  The details of model specification are given"                            
 [6] "under `Details'."                                                                             
 [7] ""                                                                                             
 [8] "\\item[\\code{data}] ...snip...