如何使用 Rmarkdown 制作 variable-length 报告?

How can I make a variable-length report using Rmarkdown?

我正在使用 R / Rmarkdown / knitr 通过 render() 生成多个报告 (pdf),但报告的内容/长度会因基础数据的某些特征而异。

举个例子,假设我有 10 个不同的数据集,每个数据集有 50 个变量,我正在检查数据中所有 50 个变量的相关矩阵。我想为每个数据集生成一个报告,每个数据集都有一个新页面,每个变量对的相关性大于 0.5,每个变量对的相关性小于 -0.5。满足这些阈值的相关性数量将因数据集而异,因此报告长度/页数将因数据集而异。

我学会了使用 {asis, echo = somecondition, eval = somecondition} 来评估是否需要包括整个部分(例如,当没有小于 -0.5 的负相关时)。我还看到 报告中可能存在 variable-length 个参数,但这些解决方案不包括在新页面上打印每个结果。我还想在每个报告相关性的页面上包含 headers 部分。

对我来说困难在于,我能想到的任何解决方案都需要将文本块和 r 代码相互嵌套。对于我如何解决问题的一些示例 Rmd 代码,我尝试在新页面上为每个小数据集打印一个新的直方图,使用“```”表示三个刻度通常不会搞砸的地方示例代码格式:

"```"{r, echo = FALSE}
datlist <- list(df1 = rnorm(100), df2 = rnorm(100), df3 = rnorm(100)) # fake data
"```"

Some Text Introducing the Report


"```"{'asis', eval = length(datlist) > 0} # evaluating if the section is to be included
"```"{r, echo = FALSE, eval = length(datlist) > 0}

for(i in 1:length(datlist)){ # starting the variable-length scope 

"```"{'asis', eval = length(datlist) > 0} # the information to be included on each new page

\newpage
\section{`r (names(datlist[i]))`}
Here is a histogram of the data found in `r (names(datlist[i]))`.
`r hist(unlist(datlist[i]))`

"```"
} # closing the for loop above
"```" 
"```"

非常欢迎任何帮助,包括使用完全不同方法的解决方案。

两个变量之间始终存在相关性,所以我不确定这是否是您想要的,但以下代码将显示绝对值大于 0.5 的所有变量对的相关性。

---
title: "Untitled"
author: "Author"
date: "18 November 2019"
output: pdf_document
---

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

```{r, echo = FALSE}
datlist <- data.frame(var1 = rnorm(100),
                      var2 = rnorm(100),
                      var3 = rnorm(100)) # fake data
# add some correlations
datlist$var4 <- datlist$var1*(rnorm(100,0,0.05)+1)
datlist$var5 <- datlist$var3*(rnorm(100,0,0.05)-1)
# get all correlations, there is probably an easier way of doing this...
corlist <- as.data.frame(t(combn(colnames(datlist),2)))
corlist$cor <- apply(corlist,1,function(x) {
  cor(datlist[,x[1]],datlist[,x[2]])
})
```

Some Text Introducing the Report

```{r, results='asis', echo=F}
apply(corlist[abs(corlist$cor)>0.5,],1, function(x) {
   cat('\n')  
   cat("# Correlation between ", x[1], " and ",x[2],"\n")
   cat("The correlation between both variables was ", x[3], ".\n")
})
```

当然你可以扩展循环的内容来对变量做任何你想做的事情。

来自here

的原始解决方案