如何解决将字符元素传递给 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,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()
将 R-Script 中的数据导入 Markdown-Script。因为我想遍历不同的数据帧,所以我写了一个简单的循环。
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")))
如果有人能帮忙我会很高兴!提前致谢。
解决方法
解决手头问题的直接方法是将 df_names[i]
包裹在 get()
中,以便访问名称与 df_names[i]
匹配的对象,而不是传递 df_names[i]
的值至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"))
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。