在Makefile中创建变量实现渲染并将输出移至新子目录
解决方案:将渲染+移动整合为变量的两种思路
你可以通过两种方式实现把「渲染Rmd到HTML并移动到指定目录」的逻辑封装成变量,下面分别说明:
思路1:直接让rmarkdown渲染到目标目录(推荐)
最省事的方式是利用rmarkdown::render()的output_dir参数,直接把输出文件生成在reports/目录里,这样就不需要额外的mv命令了。修改你的变量和规则如下:
# define VARIABLES for Makefile RENDER = Rscript -e "require(rmarkdown); render('$<', output_dir='$(REP)')" DAT = ./data ANL = ./analysis REP = ./reports VPATH = $(DAT) $(ANL) $(REP) # generate a report in html $(REP)/foo.html: foo.Rmd bar.rds $(RENDER)
关键改动说明:
- 把
RENDER变量里的render('$<')改成render('$<', output_dir='$(REP)'),这样渲染出来的HTML会直接放到$(REP)(也就是./reports)目录下 - 规则的目标也改成
$(REP)/foo.html,让Make明确知道输出文件的位置,避免后续依赖检查出问题
思路2:封装「渲染+移动」为组合命令变量
如果你更习惯保留先在当前目录渲染、再移动的流程,可以创建一个整合了两步的变量,比如RENDER_AND_MOVE:
# define VARIABLES for Makefile RENDER = Rscript -e "require(rmarkdown); render('$<')" RENDER_AND_MOVE = $(RENDER) && mv $(notdir $@) $(REP) DAT = ./data ANL = ./analysis REP = ./reports VPATH = $(DAT) $(ANL) $(REP) # generate a report in html foo.html: foo.Rmd bar.rds $(RENDER_AND_MOVE)
关键改动说明:
RENDER_AND_MOVE变量把原来的两行命令用&&连接起来,确保渲染成功后才执行移动$(notdir $@)是Make的自动变量,用来获取目标文件的文件名(这里就是foo.html),避免硬编码文件名,让规则更通用
如果以后要生成多个报告,思路1的写法扩展性更好——比如你可以写通用规则:
$(REP)/%.html: $(ANL)/%.Rmd bar.rds $(RENDER)
这样所有analysis/下的Rmd文件都能自动生成对应的HTML到reports/目录里,不需要逐个写规则。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

