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

mar*_*c1s 7 parallel-processing makefile r knitr r-markdown

我创建了一个简单的例子来说明我目前遇到的问题.

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

```{r}
plot(rnorm(10000))
```
Run Code Online (Sandbox Code Playgroud)

和一个包含以下内容的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')"
Run Code Online (Sandbox Code Playgroud)

如果我按顺序运行Makefile文件

make
Run Code Online (Sandbox Code Playgroud)

没有问题.

如果我并行运行makefile

make -j 2
Run Code Online (Sandbox Code Playgroud)

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

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

mar*_*c1s 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_$@
Run Code Online (Sandbox Code Playgroud)

对于初始代码有两处修改。

  1. 正如卡尔评论的那样,我已经包含了 opts_knit$set(base.dir= "dir_example0?.html") 行,以便在该路径中创建图形文件夹。
  2. 我已经在 Rscript -e 命令中交换了“和 ' 符号,如此处评论的那样

并行执行

make -j 2
Run Code Online (Sandbox Code Playgroud)

工作正常。