And*_*own 2 r knitr r-markdown bookdown
我创建了一个 R Markdown 来检查一系列数据集中的错误(例如,给定列中是否有空格?如果有,则打印一条语句,说明存在 NA 以及哪些行具有 NA)。我已经设置 R Markdown 来输出bookdown::word_document2. 我有大约 100 个数据集,需要在其上运行相同的 R Markdown 并分别为每个数据集获取 Word 文档输出。
有没有办法在所有数据集上运行相同的 R Markdown 并为每个数据集获取一个新的 Word 文档(这样它们就不会被覆盖)?所有数据集都位于同一目录中。我知道每次编织文档时输出都会被覆盖;因此,我需要能够根据数据集/文件名保存每个word文档。
\n最小的例子
\n创建包含 3 个 .xlsx 文件的目录
\nlibrary(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\')\nRun Code Online (Sandbox Code Playgroud)\nRMarkdown
\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```\nRun Code Online (Sandbox Code Playgroud)\ntest.xlsx因此,我将使用目录中的第一个 .xlsx 数据集 ( )运行此 R Markdown /data,并保存 Word 文档。然后,我想对目录中列出的每个其他数据集执行此操作(即,list.files(path = "./data")保存一个新的 Word 文档。因此,每个 RMarkdown 中唯一会更改的就是这一行:dataset <- openxlsx::read.xlsx("./data/test.xlsx")。我知道我需要设置设置一些参数,我可以在 rmarkdown::render 中使用这些参数,但不确定如何操作。
我查看了其他一些 SO 条目(例如,如何将两个 RMarkdown (.Rmd) 文件合并为一个输出?或有没有办法生成 RMarkdown 文档的缓存版本,然后直接从缓存生成多个输出?),但大多数专注于组合 .Rmd 文件,而不是运行同一文件的不同迭代。我还查看了将参数传递给 R Markdown。
\n我也从这里尝试了以下内容。此处,所有添加内容均已添加到上面的 R Markdown 示例中。
\n将其添加到 YAML 标头中:
\nparams:\n directory:\n value: x\nRun Code Online (Sandbox Code Playgroud)\n将其添加到setup代码块中:
# Pull in the data\ndataset <- openxlsx::read.xlsx(file.path(params$directory))\nRun Code Online (Sandbox Code Playgroud)\n然后,最后我运行以下代码来呈现文档。
\nrmarkdown::render(\n input = \'Hello_World.Rmd\'\n , params = list(\n directory = "./data"\n )\n)\nRun Code Online (Sandbox Code Playgroud)\n但是,尽管我只有 .xlsx 文件,但出现以下错误/data:
\n\n从第 14-24 行退出 (Hello_World.Rmd) 错误: openxlsx 只能\n读取 .xlsx 文件
\n
我还在完整的 .Rmd 文件上尝试过此操作,并收到以下错误,尽管路径完全相同。
\n\n\n从第 14-24 行退出 (Hello_World.Rmd) 文件错误(con,\n"rb") : 无法打开连接
\n
*注意:第 14\xe2\x80\x9324 行本质上是setup.Rmd 的部分。
我不确定我需要改变什么。我还需要使用原始文件名生成多个输出文件(例如来自 的“test” test.xlsx、来自 的“another”another.xlsx等)
您可以render在循环中调用来处理file作为参数传递的每个:
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}\nRun 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```\nRun Code Online (Sandbox Code Playgroud)\n