Knitr Mavens,
背景:使用knitr报告包含许多嵌入图的报告.在报告正文中,所有恰当的是图表,而不是代码.
例如:
```{r graph_XYZ_subset, echo = FALSE, message = TRUE,
fig.cap = "Text that explains the graph"}
graph.subset <- ggplot() + ...
```
这部分工作正常.
但是,需要显示代码的关键部分(例如,关键统计分析和关键图形生成)……但是在附录中.
这导致了这个问题:有没有办法将一个knitr块从脚本的早期部分复制到后面的部分?
为了确保准确性,理想的是附录中的代码列出(显示)报告中实际执行的所有代码.
例如:
# ADDENDUM - Code Snippets
### Code to Generate Subset Graph
\\SOMEHOW COPY the code from graph_XYZ_subset to here without executing it.
### Code to Compute the Mean of Means of the NN Factors
\\Copy another knitr chunk which computes the mean of means, etc.
### And So On...
\\Copy chunks till done
* * * * * * * *
有任何想法吗? knitr有没有办法执行这些类型的块复制?
最佳答案 有几个选项,其中四个听,下面简要解释.易辉在
How to reuse chunks的解释也可能有所帮助.
\documentclass{article}
\begin{document}
\section{Output}
<<mychunk, echo = FALSE>>=
print("Hello World!")
@
\section{Source code}
Option 1: Use an empty chunk with the same label.
<<mychunk, eval = FALSE>>=
@
Option 2: Embed in other chunk (no advantage in this case). Note that there is no equality sign and no at for the inner chunk.
<<myOtherChunk, eval = FALSE>>=
<<mychunk>>
@
Option 3: Use \texttt{ref.label}.
<<ref.label = "mychunk", eval = FALSE>>=
@
Option 4: Define the chunk in an external file you read in using \texttt{read\_chunk}. Then use Option 1--3 to execute the chunk (with \texttt{eval = TRUE}; default) or show it's code (with \texttt{eval = FALSE}).
\end{document}
我通常更喜欢选项4.这允许您将编程逻辑与编写文档分开.
在mychunk将被放置并且图形将显示在PDF中,您在Rnw文件中只有<< mychunk>> =并且不必为生成图形的所有代码而烦恼.开发代码也更容易,因为在交互式会话中,您可以将所有代码放在一个位置,而不必在从一个块转到下一个块时滚动报告的所有文本.
编辑:
上面提到的选项有一个共同点,你需要手动维护一个块列表,以显示在附录中.这里有两个选项来避免这种情况不幸的是,两者都有一些缺点:
选项1:自动创建已执行的所有块的列表并显示其代码.
这可以使用注册所有块名称的chunk hook
来实现.在文档中的所有其他块之前包括以下块:
<<echo = FALSE>>=
library(knitr)
myChunkList <- c()
listChunks <- function(before, options, envir) {
if (before) {
myChunkList <<- c(myChunkList, options$label)
}
return(NULL)
}
knit_hooks$set(recordLabel = listChunks) # register the new hook
opts_chunk$set(recordLabel = TRUE) # enable the new hook by default
@
如果要显示代码(例如在附录中),请插入以下块:
<<showCode, ref.label = unique(myChunkList), eval = FALSE>>=
@
不幸的是,块之间没有边缘或任何其他视觉分离.
选项2:并不总是需要使用块钩子,因为有一个函数all_labels()返回所有块标签的列表.但是,您的文件中可能存在无法执行的块,您可能不希望看到它们的代码.此外,选项1允许仅通过在其块选项中设置recordLabel = FALSE来跳过某些块.