RMarkdown文档-如何延迟内联代码段的knitr评估,直到后面的块处理完毕?

5hcedyr0  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(82)

我创建了一个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

testobj <- c(1, 2, 3)
型
Knitr抛出一个对象未找到错误。我是错误地执行了这个建议,还是这个建议没有达到我想要的效果?
mrfwxfqh

mrfwxfqh1#

这里是一个简单的工作示例,您在摘要之前设置第一个块,如果您需要调整其他thigs(如\graphicspath{}),则可以在文档的开头设置。
如果包含列表的Rdata文件不存在,则在此块中创建一个列表。您需要用文本中调用的值填充它。
当第一次运行这个例子时,您会得到

第二轮你就可以



请注意,这种方式可以避免运行长时间的计算,并简单地保存其结果。

\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}

字符串

woobm2wo

woobm2wo2#

下面是另一种选择:
1.在你的摘要之前创建一个块(或几个)。
1.使用块导入和清理数据。
1.然后计算出现在抽象中的每个值,并将每个值保存到一个命名对象中。
1.现在只需要抽象地引用内联代码中的命名对象(而不是自己进行计算)。
优点:

  • 所有计算都已完成并保存,因此您也可以在报告中稍后引用它们。
  • 因为所有的数据预处理都已经在摘要之前的块中完成了,所以报告中后面的r代码块可以专注于创建图形、表格或执行更复杂的分析。
  • 对象(计算结果)在您显式调用它们之前不会出现(预抽象块在抽象本身之前不会有任何可见的输出)。

下面是一个例子:

```{r setup, include=FALSE}

# Set chunk options:
knitr::opts_chunk$set(echo = FALSE, 
                      message = FALSE, 
                      warning = FALSE, 
                      eval = TRUE)

# Check if pacman is installed, install if not:
if (!require("pacman")) install.packages("pacman")

# Use pacman to load the rest of the required packages (below are examples):
pacman::p_load(
  rmarkdown,
  knitr, 
  tidyverse,
  officedown,
  officer, 
  rio,
  here
)

mydata <- rio::import(here("data", "mydata.xlsx")) %>%

   # Data cleaning steps...

# Calculate figures for the abstract:

n_cases <- nrow(mydata)

Abstract

This is an abstract. There were r n_cases recruited to the study.

字符串

相关问题