RMarkdown文档 - 如何延迟内联代码片段的编织器评估,直到后续块处理完毕?

时间:2017-12-13 16:37:56

标签: r knitr r-markdown

我创建了一个rmarkdown报告,其中包含一堆代码块。我现在正在为它创建摘要首页,并希望包含内联计算,例如

Blah blah blah summary stuff.... We found the mean to be `r mean(some_object_from_the_report)`. Blah blah blah more summary stuff.

在RMD文件的开头,some_object_from_the_report还没有存在。是否有任何方法可以告诉knitr推迟评估该代码片段,直到后面的项目全部计算完毕为止?

感谢您的任何提示!

编辑:

建议注释是在knitr选项中设置echo = false。要么我做错了,要么它对我的情况没有帮助。以下简短的例子说明了这一点。

---
title: "Minimal test of delayed evaluation"
author: "sff"
date: "December 13, 2017"
output: html_document
---

```{r setup, include=TRUE}
knitr::opts_chunk$set(echo = FALSE)
```

## Summary

Summary of blahblahblah. Also here's a mean from the report: `r mean(testobj)`.


## Report

```{r report_stuff}
testobj <- c(1, 2, 3)
```

Knitr抛出一个未找到对象的错误。我是否错误地执行了该建议,或者该建议未能实现我所寻找的目标?

1 个答案:

答案 0 :(得分:1)

这是一个简单的工作示例,您在摘要之前设置了第一个块,如果您需要调整\graphicspath{}之类的其他因素,可以在文档的最开头设置。

如果包含列表的Rdata文件不存在,则在此块中创建一个列表。您需要使用文本中调用的值填充它。

首次运行示例时,您会得到 first run

第二轮你会得到

second run

请注意,通过这种方式,您可以避免运行长时间的计算,只需保存结果。

\documentclass{article}    
\title{Testing how to save results for the abstract}
\author{}
\begin{document}
% this chunk comes just after begin{document}
<< init, echo=FALSE, eval=TRUE,results="hide" >>=
require(knitr)
summary_list_path <-paste0(getwd(),"/data/summary_list.Rdata")
if (!file.exists(summary_list_path)){
  summary_list<-list()
  summary_list[["A"]]<-list()
  summary_list[["B"]]<-list()
  summary_list[["A"]][["N"]]<-NA
  summary_list[["A"]][["p"]]<-NA
  summary_list[["B"]][["text"]]<-"extremely sad"
} else {
  load(summary_list_path)
}
@
\maketitle
\begin{abstract}
My population is \Sexpr{summary_list[["A"]][["N"]]} and the p value was \Sexpr{summary_list[["A"]][["p"]]} as a result I am \Sexpr{summary_list[["B"]][["text"]]}
\end{abstract}

<<chunk_1, echo=FALSE, eval=TRUE,results="hide" >>=
summary_list[["A"]][["N"]]<-20
summary_list[["A"]][["p"]]<-0.05
# save your list at the end of each chunk, that was you can also avoid 
# processing everyting.
save(summary_list,file=summary_list_path)
@

<<chunk_2, echo=FALSE, eval=TRUE,results="hide" >>=
summary_list[["B"]][["text"]]<-"happy"
save(summary_list,file=summary_list_path)
@

\end{document}