在许多不同的数据集上运行 R Markdown 并单独保存每个 knitted word 文档

And*_*own 2 r knitr r-markdown bookdown

我创建了一个 R Markdown 来检查一系列数据集中的错误(例如,给定列中是否有空格?如果有,则打印一条语句,说明存在 NA 以及哪些行具有 NA)。我已经设置 R Markdown 来输出bookdown::word_document2. 我有大约 100 个数据集,需要在其上运行相同的 R Markdown 并分别为每个数据集获取 Word 文档输出。

\n

有没有办法在所有数据集上运行相同的 R Markdown 并为每个数据集获取一个新的 Word 文档(这样它们就不会被覆盖)?所有数据集都位于同一目录中。我知道每次编织文档时输出都会被覆盖;因此,我需要能够根据数据集/文件名保存每个word文档。

\n

最小的例子

\n

创建包含 3 个 .xlsx 文件的目录

\n
library(openxlsx)\n\nsetwd("~/Desktop")\ndir.create("data")\n\ndataset <-\n  structure(\n    list(\n      name = c("Andrew", "Max", "Sylvia", NA, "1"),\n      number = c(1, 2, 2, NA, NA),\n      category = c("cool", "amazing",\n                   "wonderful", "okay", NA)\n    ),\n    class = "data.frame",\n    row.names = c(NA,-5L)\n  )\n\nwrite.xlsx(dataset, \'./data/test.xlsx\')\nwrite.xlsx(dataset, \'./data/dataset.xlsx\')\nwrite.xlsx(dataset, \'./data/another.xlsx\')\n
Run Code Online (Sandbox Code Playgroud)\n

RMarkdown

\n
---\ntitle: Hello_World\nauthor: "Somebody"\noutput:\n  bookdown::word_document2:\n    fig_caption: yes\n    number_sections: FALSE\n\n---\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(echo = TRUE)\n\nsetwd("~/Desktop")\n\nlibrary(openxlsx)\n\n# Load data for one .xlsx file. The other datasets are all in "/data". \ndataset <- openxlsx::read.xlsx("./data/test.xlsx")\n\n```    \n\n# Test for Errors\n\n```{r test, echo=FALSE, comment=NA}\n\n# Are there any NA values in the column?\nsuppressWarnings(if (TRUE %in% is.na(dataset$name)) {\n  na.index <- which(is.na(dataset$name))\n  cat(\n    paste(\n      "\xe2\x80\x93 There are NAs/blanks in the name column. There should be no blanks in this column. The following row numbers in this column need to be corrected:",\n      paste(na.index, collapse = \', \')\n    ),\n    ".",\n    sep = "",\n    "\\n",\n    "\\n"\n  )\n})\n\n```\n
Run Code Online (Sandbox Code Playgroud)\n

test.xlsx因此,我将使用目录中的第一个 .xlsx 数据集 ( )运行此 R Markdown /data,并保存 Word 文档。然后,我想对目录中列出的每个其他数据集执行此操作(即,list.files(path = "./data")保存一个新的 Word 文档。因此,每个 RMarkdown 中唯一会更改的就是这一行:dataset <- openxlsx::read.xlsx("./data/test.xlsx")。我知道我需要设置设置一些参数,我可以在 rmarkdown::render 中使用这些参数,但不确定如何操作。

\n

我查看了其他一些 SO 条目(例如,如何将两个 RMarkdown (.Rmd) 文件合并为一个输出?有没有办法生成 RMarkdown 文档的缓存版本,然后直接从缓存生成多个输出?),但大多数专注于组合 .Rmd 文件,而不是运行同一文件的不同迭代。我还查看了将参数传递给 R Markdown

\n

我也从这里尝试了以下内容。此处,所有添加内容均已添加到上面的 R Markdown 示例中。

\n

将其添加到 YAML 标头中:

\n
params:\n  directory:\n    value: x\n
Run Code Online (Sandbox Code Playgroud)\n

将其添加到setup代码块中:

\n
# Pull in the data\ndataset <- openxlsx::read.xlsx(file.path(params$directory))\n
Run Code Online (Sandbox Code Playgroud)\n

然后,最后我运行以下代码来呈现文档。

\n
rmarkdown::render(\n    input  = \'Hello_World.Rmd\'\n    , params = list(\n        directory = "./data"\n    )\n)\n
Run Code Online (Sandbox Code Playgroud)\n

但是,尽管我只有 .xlsx 文件,但出现以下错误/data

\n
\n

从第 14-24 行退出 (Hello_World.Rmd) 错误: openxlsx 只能\n读取 .xlsx 文件

\n
\n

我还在完整的 .Rmd 文件上尝试过此操作,并收到以下错误,尽管路径完全相同。

\n
\n

从第 14-24 行退出 (Hello_World.Rmd) 文件错误(con,\n"rb") : 无法打开连接

\n
\n

*注意:第 14\xe2\x80\x9324 行本质上是setup.Rmd 的部分。

\n

我不确定我需要改变什么。我还需要使用原始文件名生成多个输出文件(例如来自 的“test” test.xlsx、来自 的“another”another.xlsx等)

\n

Wal*_*ldi 5

您可以render在循环中调用来处理file作为参数传递的每个:

\n
dir_in <- 'data'\ndir_out <- 'result'\n\nfiles <- file.path(getwd(),dir_in,list.files(dir_in))\n\nfor (file in files) {\n  print(file)\n  rmarkdown::render(\n    input  = 'Hello_World.Rmd',\n    output_file = tools::file_path_sans_ext(basename(file)),\n    output_dir = dir_out,\n    params = list(file = file)\n  )\n}\n
Run Code Online (Sandbox Code Playgroud)\n

降价:

\n
---\ntitle: Hello_World\nauthor: "Somebody"\noutput:\n  bookdown::word_document2:\n    fig_caption: yes\n    number_sections: FALSE\nparams: \n  file: ""\n---\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(echo = TRUE)\n\nlibrary(openxlsx)\n\n# Load data for one .xlsx file. The other datasets are all in "/data". \ndataset <- openxlsx::read.xlsx(file)\n\n```    \n\n# Test for Errors\n\n```{r test, echo=FALSE, comment=NA}\n\n# Are there any NA values in the column?\nsuppressWarnings(if (TRUE %in% is.na(dataset$name)) {\n  na.index <- which(is.na(dataset$name))\n  cat(\n    paste(\n      "\xe2\x80\x93 There are NAs/blanks in the name column. There should be no blanks in this column. The following row numbers in this column need to be corrected:",\n      paste(na.index, collapse = ', ')\n    ),\n    ".",\n    sep = "",\n    "\\n",\n    "\\n"\n  )\n})\n\n```\n
Run Code Online (Sandbox Code Playgroud)\n