【发布时间】:2017-11-09 11:56:55
【问题描述】:
我是 Makefile 新手,我想在 Rmarkdown 文件更改时间戳时使用它来渲染它们,以生成相应的 .pdf 文件。文件data_prep_1.Rmd 被渲染为.pdf 并额外生成输出文件all_sample_data.csv。当data_prep_1.Rmd 被改变(或者它的时间戳被改变)时,它应该被重新渲染,../bioinformatics/Reads_by_sample.Rmd 和distance_matrices.Rmd 因为它们依赖于.csv 文件。如果../bioinformatics/Reads_by_sample.Rmd 的时间戳相对于它的.pdf 发生了变化,那么只有这个.Rmd 文件应该被重新渲染。
将所有 : 和 .pdf 和 .csv 文件放在第一行将导致两个块在每次调用 make 时运行。
我有:
../../data/all_sample_data.csv : data_prep_1.Rmd
Rscript -e "rmarkdown::render('data_prep_1.Rmd')"
Rscript -e "rmarkdown::render('../bioinformatics/Reads_by_sample.Rmd')"
Rscript -e "rmarkdown::render('distance_matrices.Rmd')"
../bioinformatics/Reads_by_sample.pdf : ../bioinformatics/Reads_by_sample.Rmd
Rscript -e "rmarkdown::render('../bioinformatics/Reads_by_sample.Rmd')"
如果我执行touch data_prep_1.Rmd,然后执行make,则第一个块将按需要运行。
但是如果我这样做touch ../bioinformatics/Reads_by_sample.Rmd,那么make
我收到make: '../../data/all_sample_data.csv is up to date'。
我知道这是对 Makefile 的笨拙使用,但我怎样才能在单个 Makefile 中获得我想要的行为?
【问题讨论】:
-
您需要添加一个
PHONY目标,例如all,它具有../../data/all_sample_data.csv和../bioinformatics/Reads_by_sample.pdf作为先决条件,并且是makefile 中的第一个目标。 -
但是即使只更改了 Reads_by_sample.Rmd,第一个块中的所有命令也不会运行吗?我想在先决条件没有改变时避免渲染。
-
除非您修改
data_prep_1.Rmd,否则第一条规则的配方不会运行。
标签: makefile rstudio r-markdown gnu-make