在循环中使用rmarkdown创建表

y4ekin9u  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(109)

我想在一个单独的表中为3种可能性(4,6和8)之间的每个气缸(“cyl”)创建一个pdf报告。但是,我需要为循环中的每个气缸创建一个表,为此我尝试这样做:

library(knitr)
    library (rmarkdown)
    data(mtcars)
    id.cyl <-unique(mtcars$cyl)
    for(i in 1:id.cyl){
    mtcars.sub<- 
    mtcars[mtcars$cyl==id.mtcars[i],]
    kagle(mtcars.sub)
    }
    render("my_loop_report.pdf", 
    pdf_document())

这个代码不工作,我需要一些建议来解决它。请任何帮助吗?

mccptt67

mccptt671#

创建生成报告的.rmd文件,并将柱面作为值传递。
下面是.rmd文件(比如cylinder.rmd

---
title: "cylinder_report"
author: "author_name"
date: "2023-01-25"
output: pdf_document
params:
  cylinder: 0
---

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

## Cylinder `r params$cylinder`
``{r output, echo=FALSE}
knitr::kable(df[df$cyl == params$cylinder,])
``

然后,您可以单独循环柱面值,每次传递柱面值

cyls = unique(mtcars$cyl)
for(cyl in cyls) {
  rmarkdown::render(
    input = "cylinder.Rmd",
    output_file = paste0("cylinder_report_", cyl),
    params = list(cylinder = cyl)
    )
}

这将产生cylinder_report_4.pdfcylinder_report_6.pdfcylinder_report_8.pdf
(Note,在这个简单的示例中,您甚至不必传递参数;实际上,将mtcar加载到df中并在.rmd中对其进行子集化是不必要的。当您使用'rmarkdown::render()时,环境中的对象可用于.rmd文件,因此您还可以将循环中的数据子集化到rmd文件之外,如下所示:

cyls = unique(mtcars$cyl)
for(cyl in cyls) {
  df = mtcars[mtcars$cyl == cyl,]
  rmarkdown::render(
    input = "cylinder.Rmd",
    output_file = paste0("cylinder_report_", cyl)
    )
}

并且.rmd可以被简化成这样(注意,没有参数,没有创建df,没有子集,等等:

---
title: "cylinder_report"
author: "author_name"
date: "2023-01-25"
output: pdf_document
---

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

## Cylinder `r cyl`
``{r output, echo=FALSE}
knitr::kable(df)
``

相关问题