首页 > 解决方案 > 将字符元素传递给 render() 以创建几个不同的 PDF

问题描述

我尝试使用 Markdown 创建许多看起来相同但使用不同数据的 PDF。为此,我创建了一些代码来生成随机数据,这些数据应该用于创建 PDF 文件。


library(tidyverse) 


r_sample <- seq(1, 5, by = 0.1)

nr_rows <- 10

df_names <- vector()

for(i in 1:2){
  name <- paste0("i_",i)
  
  i_sample <- tibble("Name" = paste0("i_", seq(1:nr_rows)))
  i_sample <- i_sample %>% add_column(sample(r_sample, nr_rows, replace = TRUE)) %>% 
    rename("Value" = "sample(r_sample, nr_rows, replace = TRUE)")
  
  
  assign(name, i_sample)
  df_names[i] <- name
}

Markdown-Script 几乎是空的,因为它只是用于测试目的。


---
title: "Test"
output: pdf_document
params: 
  data : ""
---

This is just a Test. 

```{r echo = FALSE}

params$data
```.  #error made intentionally!

现在我尝试使用render(). 因为我想循环不同的数据帧,所以我写了一个简单的循环。


for(i in 1:2){
  rmarkdown::render('Test.Rmd', params = list(data = df_names[i]), 
                    output_file = glue::glue(paste0("file_", df_names[i], ".pdf")))
}

现在来解决问题。Markdown 将输入理解env_names[i]为字符而不是数据框。但是,如果我像这样手动输入:

rmarkdown::render('Test.Rmd', params = list(data = i_1), output_file = glue::glue(paste0("file_i_1.pdf")))

有用。我理解这个问题,但我找不到解决这个问题的方法。

如果有人可以提供帮助,我将非常高兴!提前致谢。

标签: rr-markdownknitr

解决方案


手头问题的直接解决方法是换df_names[i]get()以访问名称匹配的对象,df_names[i]而不是传递df_names[i]to的值render()

rmarkdown::render('Test.Rmd', params = list(data = get(df_names[i])), 
                    output_file = glue::glue(paste0("file_", df_names[i], ".pdf")))

然而,在全局环境中动态创建对象assign在 R 中是相当单一的——不这样做也消除了get()事后使用的需要。

因此,我建议将问题中的代码片段编写如下:

r_sample <- seq(1, 5, by = 0.1)
nr_rows <- 10

df_list <- list()

for(i in 1:2){
  df_list[[i]] <- tibble(Name = paste0("i_", seq(1:nr_rows)), Value = sample(r_sample, nr_rows, replace = TRUE))
}

然后,循环渲染文档变为:

for(i in 1:2){
  rmarkdown::render('Test.Rmd', params = list(data = df_list[[i]]), 
                    output_file = paste0("file_i_", i, ".pdf"))
}

推荐阅读