使用Makefile并行化时,R markdown文件会重叠数字

时间:2014-05-14 07:59:44

标签: r parallel-processing makefile knitr r-markdown

我创建了一个简单的示例,显示了我目前遇到的问题。

我有一个名为example.Rmd的R-markdown文件,其中包含以下代码

```{r}
plot(rnorm(10000))
```

和包含以下内容的Makefile文件

all : example01.html example02.html

example01.html : example.Rmd
    Rscript -e "library(knitr); knit2html(input='example.Rmd', output='example01.html')"

example02.html : example.Rmd
    Rscript -e "library(knitr); knit2html(input='example.Rmd', output='example02.html')"

如果我按顺序运行Makefile文件

make

没有问题。

如果我并行运行makefile

make -j 2

knit2html函数生成的块重叠,两个html文件包含相同的图像。

有什么建议吗?我一直在寻找解决方案,但我一无所获。

1 个答案:

答案 0 :(得分:2)

使用卡尔的想法,我写了一个可能的解决方案。

all : example01.html example02.html

example01.html : example.Rmd
    mkdir -p dir_$@ 
    Rscript -e 'library(knitr); opts_knit$$set(base.dir = "dir_$@"); knit2html(input="example.Rmd", output="dir_$@/$@")'
    mv dir_$@/$@ .
    rm -r dir_$@

example02.html : example.Rmd
    mkdir -p dir_$@
    Rscript -e 'library(knitr); opts_knit$$set(base.dir = "dir_$@"); knit2html(input="example.Rmd", output="dir_$@/$@")'
    mv dir_$@/$@ .
    rm -r dir_$@

初始代码有两处修改。

  1. 正如Karl评论的那样,我已经将opts_knit $ set(base.dir =“dir_example0?.html”)行包含在图文件夹在该路径中创建的方式中。
  2. 我在Rscript -e命令中交换了“和'符号,注释为here
  3. 并行执行

    make -j 2
    

    工作正常。