Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用helpExtract函数将R函数的示例代码获取到knitr中_R_Latex_Knitr_Noamtools_Helpextract - Fatal编程技术网

使用helpExtract函数将R函数的示例代码获取到knitr中

使用helpExtract函数将R函数的示例代码获取到knitr中,r,latex,knitr,noamtools,helpextract,R,Latex,Knitr,Noamtools,Helpextract,我想获得在knitr中使用的R函数的示例代码。可能有一种简单的方法,但使用可从(由@AnandaMahto编写)获得的helpExtract函数尝试了以下代码。用我的方法,我必须看一个函数是否有示例,并且必须只包括那些有示例的函数 这是一种非常低效和幼稚的方法。现在我试图只包括那些有示例的函数。我尝试了以下代码,但它没有按预期工作。如何从R包中提取示例代码 \documentclass{book} \usepackage[T1]{fontenc} \begin{document} <&

我想获得在
knitr
中使用的
R
函数的示例代码。可能有一种简单的方法,但使用可从(由@AnandaMahto编写)获得的
helpExtract
函数尝试了以下代码。用我的方法,我必须看一个函数是否有示例,并且必须只包括那些有示例的函数

这是一种非常低效和幼稚的方法。现在我试图只包括那些有示例的函数。我尝试了以下代码,但它没有按预期工作。如何从
R
包中提取示例代码

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

\begin{document}

<< label=packages, echo=FALSE>>=
library(ggplot2)
library(devtools)
source_gist("https://gist.github.com/mrdwab/7586769")
library(noamtools)     # install_github("noamtools", "noamross")
@


\chapter{Linear Model}

<< label = NewTest1, results="asis">>=
tryCatch(
    {helpExtract(lm, section="Examples", type = "s_text");
    cat(
        "\\Sexpr{
          knit_child(
                  textConnection(helpExtract(lm, section=\"Examples\", type = \"s_text\"))
                , options = list(tidy = FALSE, eval = TRUE)
                )
             }", "\n"
        )
     }
  , error=function(e) FALSE
  )
@


\chapter{Modify properties of an element in a theme object}

<< label = NewTest2, results="asis">>=
tryCatch(
    {helpExtract(add_theme , section="Examples", type = "s_text");
    cat(
        "\\Sexpr{
          knit_child(
                  textConnection(helpExtract(add_theme , section=\"Examples\", type = \"s_text\"))
                , options = list(tidy = FALSE, eval = TRUE)
                )
             }", "\n"
        )
     }
  , error=function(e) FALSE
  )
@

\end{document}
\documentclass{book}
\usepackage[T1]{fontenc}
\开始{document}
>=
图书馆(GG2)
图书馆(devtools)
资料来源https://gist.github.com/mrdwab/7586769")
库(noamtools)#安装_github(“noamtools”、“noamross”)
@
\第{章线性模型}
>=
tryCatch(
{helpExtract(lm,section=“Examples”,type=“s_text”);
猫(
“\\Sexpr{
针织童(
textConnection(helpExtract(lm,section=\“Examples\”,type=\“s\u text\”)
,options=list(tidy=FALSE,eval=TRUE)
)
},“\n”
)
}
,error=函数(e)FALSE
)
@
\第{章修改主题对象中元素的属性}
>=
tryCatch(
{helpExtract(添加_主题,section=“Examples”,type=“s_text”);
猫(
“\\Sexpr{
针织童(
textConnection(helpExtract(添加主题,部分=“示例”,类型=“s\U文本”)
,options=list(tidy=FALSE,eval=TRUE)
)
},“\n”
)
}
,error=函数(e)FALSE
)
@
\结束{document}

这不是一个完整的答案,所以我将其标记为社区维基。下面是两行简单的代码,用于从Rd文件中获取命名函数的示例(在本例中为
lm
)。在我看来,代码比阿南达的要点简单得多:

x <- utils:::.getHelpFile(utils::help(lm))
sapply(x[sapply(x, function(z) attr(z, "Rd_tag") == "\\examples")][[1]], `[[`, 1)

x这不是一个完整的答案,所以我将其标记为社区wiki。下面是两行简单的代码,用于从Rd文件中获取命名函数的示例(在本例中为
lm
)。在我看来,代码比阿南达的要点简单得多:

x <- utils:::.getHelpFile(utils::help(lm))
sapply(x[sapply(x, function(z) attr(z, "Rd_tag") == "\\examples")][[1]], `[[`, 1)

x以下内容可能有用

get.examples <- function(pkg=NULL) {
  suppressWarnings(f <- unique(utils:::index.search(TRUE, find.package(pkg))))
  out <- setNames(sapply(f, function(x) {
    tf <- tempfile("Rex")
    tools::Rd2ex(utils:::.getHelpFile(x), tf)  
    if (!file.exists(tf)) return(invisible())
    readLines(tf)
  }), basename(f))
  out[!sapply(out, is.null)]
}

ex.base <- get.examples('base')

也许以下内容可能有用

get.examples <- function(pkg=NULL) {
  suppressWarnings(f <- unique(utils:::index.search(TRUE, find.package(pkg))))
  out <- setNames(sapply(f, function(x) {
    tf <- tempfile("Rex")
    tools::Rd2ex(utils:::.getHelpFile(x), tf)  
    if (!file.exists(tf)) return(invisible())
    readLines(tf)
  }), basename(f))
  out[!sapply(out, is.null)]
}

ex.base <- get.examples('base')

我已经做了一些快速的工作来修改这个函数(我已经包括在内)。要点还包括一个示例Rnw文件(我还没有机会检查Rmd文件)

该函数现在如下所示:

helpExtract <- function(Function, section = "Usage", type = "m_code", sectionHead = NULL) {
  A <- deparse(substitute(Function))
  x <- capture.output(tools:::Rd2txt(utils:::.getHelpFile(utils::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))              ## Create a FALSE vector
  X[B] <- 1                               ## Initialize
  out <- split(x, cumsum(X))              ## Create a list of sections
  sectionID <- vapply(out, function(x)    ## Identify where the section starts
    grepl(section, x[1], fixed = TRUE), logical(1L))

  if (!any(sectionID)) {                  ## If the section is missing...
    ""                                    ## ... just return an empty character 
  } else {                                ## Else, get that list item
    out <- out[[which(sectionID)]][-c(1, 2)]
    while(TRUE) {                         ## Remove the extra empty lines
      out <- out[-length(out)]            ##   from the end of the file
      if (out[length(out)] != "") { break }
    } 

    switch(                               ## Determine the output type
      type,
      m_code = {
        before <- "```r"
        after <- "```"
        c(sectionHead, before, out, after)
      },
      s_code = {
        before <- "<<eval = FALSE>>="
        after <- "@"
        c(sectionHead, before, out, after)
      },
      m_text = {
        c(sectionHead, paste("    ", out, collapse = "\n"))
      },
      s_text = {
        before <- "\\begin{verbatim}"
        after <- "\\end{verbatim}"
        c(sectionHead, before, out, after)
      },
      stop("`type` must be either `m_code`, `s_code`, `m_text`, or `s_text`")
    )
  }
}

注意:由于
Sexpr
不允许使用大括号(
{
),我们需要在
Sexpr
步骤之外指定标题,这是我在一个隐藏的代码块中完成的。

我已经完成了一些修改函数的快速工作(我已经包含了该函数)。要点还包括一个示例Rnw文件(我还没有机会检查Rmd文件)

该函数现在如下所示:

helpExtract <- function(Function, section = "Usage", type = "m_code", sectionHead = NULL) {
  A <- deparse(substitute(Function))
  x <- capture.output(tools:::Rd2txt(utils:::.getHelpFile(utils::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))              ## Create a FALSE vector
  X[B] <- 1                               ## Initialize
  out <- split(x, cumsum(X))              ## Create a list of sections
  sectionID <- vapply(out, function(x)    ## Identify where the section starts
    grepl(section, x[1], fixed = TRUE), logical(1L))

  if (!any(sectionID)) {                  ## If the section is missing...
    ""                                    ## ... just return an empty character 
  } else {                                ## Else, get that list item
    out <- out[[which(sectionID)]][-c(1, 2)]
    while(TRUE) {                         ## Remove the extra empty lines
      out <- out[-length(out)]            ##   from the end of the file
      if (out[length(out)] != "") { break }
    } 

    switch(                               ## Determine the output type
      type,
      m_code = {
        before <- "```r"
        after <- "```"
        c(sectionHead, before, out, after)
      },
      s_code = {
        before <- "<<eval = FALSE>>="
        after <- "@"
        c(sectionHead, before, out, after)
      },
      m_text = {
        c(sectionHead, paste("    ", out, collapse = "\n"))
      },
      s_text = {
        before <- "\\begin{verbatim}"
        after <- "\\end{verbatim}"
        c(sectionHead, before, out, after)
      },
      stop("`type` must be either `m_code`, `s_code`, `m_text`, or `s_text`")
    )
  }
}

注意:由于
Sexpr
不允许使用花括号(
{
),我们需要在
Sexpr
步骤之外指定标题,我在一个隐藏的代码块中完成了该步骤。

(+1):谢谢@Thomas的回答。这可能是一个好的开始。我想知道如何使用
ggplot2
包中的
add_theme
函数的代码。即使使用您的方法,我们也需要知道哪些函数有示例,哪些没有。我正在尝试找到一种自动方法,其中只包括那些有示例的函数。有什么想法吗!!!@Thomas,我记不清为什么我要这样写函数。我相信这是以markdown和Swave都可以使用的方式获取帮助文件的最直接的方法。@AnandaMahto Rd解析总是有点疯狂,我想,所以原因可能有很多。@MYaseen208您应该能够o使用
attr(z,“Rd_标记”)==“\\examples”
语句确定哪些Rd文件具有渐晕。如果所有Rd元素在该比较中都返回FALSE,则没有示例。(+1):谢谢@Thomas的回答。这可能是一个好的开始。我想知道如何使用
ggplot2
包中的
add_theme
函数的代码。即使使用您的方法,我们也需要知道哪些函数有示例,哪些没有。我正在尝试找到一种自动方法,其中只包括那些有示例的函数。有什么想法吗!!!@Thomas,我记不清为什么我要这样写函数。我相信这是以markdown和Swave都可以使用的方式获取帮助文件的最直接的方法。@AnandaMahto Rd解析总是有点疯狂,我想,所以原因可能有很多。@MYaseen208您应该能够o使用
attr(z,“Rd_tag”)==“\\examples”
语句来确定哪些Rd文件具有渐晕。如果所有Rd元素在该比较中返回为FALSE,则没有示例。(+1):感谢@jbaums提供您的答案。您能解释一下如何在
knitr
之类的
结果中使用您的函数输出吗=“asis”
。谢谢(+1):谢谢@jbaums的回答。你能解释一下如何使用函数的输出,以便在
knitr
中使用,比如
results=“asis”
。谢谢“这一章”"如果没有示例,您希望返回什么?如果没有示例,那么我更希望没有任何章节。感谢@AnandaMahto为您提供的时间、努力和帮助。如果此函数的输出包含小节的标题,那将非常好。如果您能回答我的问题,我将不胜感激。谢谢我查看您的示例a增益,我看到你有
eval=TRUE
在那里。你真的想要吗?例如
plot
的行为是什么?对于没有示例的“章节”,你想要返回什么?如果没有示例,那么我将