使用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
的行为是什么?对于没有示例的“章节”,你想要返回什么?如果没有示例,那么我将