【问题标题】:Using doParallel with RMarkdown将 doParallel 与 RMarkdown 一起使用
【发布时间】:2021-11-20 17:01:43
【问题描述】:

我正在尝试将 doParallel 与 RMarkdown 一起使用。 R 代码调用一个名为report.RMD 的脚本。目标是从 iris 数据集中生成 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

【问题讨论】:

    标签: r r-markdown doparallel


    【解决方案1】:

    在这里找到一种方法: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 加上三个尾随的`...堆栈格式混乱)。

    【讨论】:

    • 这有同样的问题,当我按照给定的代码运行它时,virginica.html 文档列出了杂色物种。尽管文件名与数据帧过滤器不匹配,但数据帧的过滤方式似乎是随机的,尽管它是相同的变量。
    • 哇,你说得对。当我发布答案时,我认为它正在工作。对此感到抱歉。
    • 我更新了我的答案......不幸的是,大部分代码仍在 rmarkdown 端运行。
    猜你喜欢
    • 2015-08-31
    • 2022-08-06
    • 1970-01-01
    • 2018-10-08
    • 2019-07-12
    • 1970-01-01
    • 2015-07-03
    • 2018-10-22
    • 1970-01-01
    相关资源
    最近更新 更多