我正在尝试使用与RMarkdown并行。R代码调用一个名为report.RMD的脚本。目标是从虹膜数据集生成3个html报告,每个报告都以物种命名,其中有一个表,过滤到该物种。问题是,虽然呈现了报告,但表没有过滤到该物种,例如,virginica.html文档列出了versicolor物种。这似乎是一个并行化问题,因为当%dopar%更改为%do%时,html报告将按预期生成。
更广泛的目标是使用大规模并行处理与RMarkdown比使用下面这个例子,但只是作为一个例子。
R代码为:
library(doParallel)
library(tidyverse)
iris_list<-c("virginica","versicolor", "setosa")
no_cores <- detectCores() - 1
cl <- makeCluster(no_cores)
registerDoParallel(cl)
foreach(i = 1:length(iris_list), .packages = (.packages())) %dopar% {
cat<-iris_list[i]
iris2<-iris%>%filter(Species==cat)
rmarkdown::render("report.RMD",
output_file = paste0(cat, ".html"))
}
stopCluster(cl)
RMD代码为:
---
title: "Untitled"
date: "28 September 2021"
output: html_document
---
```{r table, echo=FALSE}
iris2
找到一个方法:https://gist.github.com/hrbrmstr/17bc21af55392f23f012f57bb2fda51c#file-do_rpt-r
library(doParallel)
library(tidyverse)
# Define report parameters
reports <- list(list(out="setosa.html", params=list(sp="setosa")),
list(out="virginica.html", params=list(sp="virginica")),
list(out="versicolor.html", params=list(sp="versicolor")))
make_report <- function(r) {
require(rmarkdown)
tf <- tempfile()
dir.create(tf)
rmarkdown::render(input="report.RMD",
output_file=r$out,
intermediates_dir=tf,
params=r$params,
quiet=TRUE)
unlink(tf)
}
no_cores <- detectCores() - 1
cl <- makeCluster(no_cores)
registerDoParallel(cl)
foreach(r=reports, .combine=c) %dopar% make_report(r)
stopCluster(cl)
Rmarkdown文件:
---
title: "Untitled"
date: "28 September 2021"
output: html_document
params:
sp: "default"
---
```{r}
data(iris)
iris[iris$Species == params$sp,]
(加上r-chunk后面的三个'…堆栈格式混乱)。