【问题标题】:How can I make a variable-length report using Rmarkdown?如何使用 Rmarkdown 制作可变长度报告?
【发布时间】:2020-03-14 03:18:38
【问题描述】:

我正在使用 R / Rmarkdown / knitr 通过 render() 生成多个报告(pdf),但报告的内容/长度会根据底层数据的某些特征而有所不同。

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

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

对我来说,困难在于我能想到的任何解决方案都需要将文本块和 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
"```" 
"```"

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

【问题讨论】:

    标签: r r-markdown knitr


    【解决方案1】:

    两个变量之间始终存在相关性,因此我不确定这是否是您想要的,但以下代码将显示绝对值大于 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的原始解决方案

    【讨论】:

    • 感谢您的帮助!根据您的反馈,我已经稍微澄清了我的问题。在您的解决方案中,有什么方法可以在应用循环中包含 \newpage 或 \section 吗?在使用您的示例时,我将“var3 和 var5 之间的相关性”从新页面开始。
    • 是的,只需在循环中添加cat("\newpage")。使用 # Your title 应该已经产生了一个部分,因为这是降价语法。
    • 非常感谢!不幸的是,我的报告的细节(不是真正的相关性)使得内容与分页符不能很好地对齐,但是根据您的回答,我能够通过制作 HTML 文档来提出合理的解决方案。跨度>
    猜你喜欢
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多