我尝试用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
现在,我尝试使用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")))它起作用了。我明白这个问题,但我找不到解决这个问题的办法。
如果有人能帮忙,我会很高兴的!提前谢谢。
发布于 2021-02-24 17:20:37
当前问题的直接修复方法是将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"))
}https://stackoverflow.com/questions/66259016
复制相似问题