将字符元素传递给 render() 以创建多个不同的 PDF
Passing a character-element to render() to create several different PDFs
我尝试使用 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 脚本几乎是空的,因为它仅用于测试目的。
---
title: "Test"
output: pdf_document
params:
data : ""
---
This is just a Test.
```{r echo = FALSE}
params$data
```. #error made intentionally!
现在我尝试使用 render()
将数据从我的 R 脚本获取到 Markdown 脚本中。因为我想遍历不同的数据帧,所以我写了一个简单的循环。
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]
匹配的对象,而不是传递 [=13] 的值=] 到 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"))
}
我尝试使用 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 脚本几乎是空的,因为它仅用于测试目的。
---
title: "Test"
output: pdf_document
params:
data : ""
---
This is just a Test.
```{r echo = FALSE}
params$data
```. #error made intentionally!
现在我尝试使用 render()
将数据从我的 R 脚本获取到 Markdown 脚本中。因为我想遍历不同的数据帧,所以我写了一个简单的循环。
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]
匹配的对象,而不是传递 [=13] 的值=] 到 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"))
}