【问题标题】:Makefile to render all targets of all .Rmd files in directoryMakefile 渲染目录中所有 .Rmd 文件的所有目标
【发布时间】:2017-10-20 12:20:21
【问题描述】:

我的目标是拥有一个通用的 Makefile,我可以将它复制到我有一个 RMD 文件的每个目录中,该文件将在此目录中调用 make 时呈现此目录中所有 .Rmd 文件中定义的所有目标。

下面的 Makefile 仅用于按预期呈现最后一个文件。我确定我做错了一些简单的事情。

我必须如何修改 Makefile 才能完成它应该做的事情?

另外:当我第二次运行make 时,所有文件都会再次生成,尽管没有更改 SOURCE 文件。

我有以下 Makefile:

SOURCES=$(shell find . -name "*.Rmd")
TARGETS_pdf=$(SOURCES:%.Rmd=%.pdf)
TARGETS_html=$(SOURCES:%.Rmd=%.html)
TARGETS_nb_html=$(SOURCES:%.Rmd=%.nb.html)
TARGETS_docx=$(SOURCES:%.Rmd=%.docx)

default: $(SOURCES)
    $(info Generating defined targets from $(SOURCES))
    @echo "$< -> $@"
    @Rscript -e "rmarkdown::render('$<', output_format = 'all')"

clean:
    rm -rf $(TARGETS_pdf)
    rm -rf $(TARGETS_html)
    rm -rf $(TARGETS_nb_html)
    rm -rf $(TARGETS_docx)

谢谢。

【问题讨论】:

    标签: r macos makefile knitr r-markdown


    【解决方案1】:

    当您运行make 时,它会执行它找到的第一条规则。在您的情况下,它是default。然后它检查该文件是否存在。如果没有,则运行脚本,该脚本应该生成目标文件 (default)。你的脚本没有这样做。这就是为什么下次 make 运行时,它会重新开始。如果文件存在,则不需要运行脚本。

    你可以这样做:

    SOURCES=$(shell find . -name "*.Rmd")
    TARGET = $(SOURCES:%.Rmd=%.pdf) $(SOURCES:%.Rmd=%.html) $(SOURCES:%.Rmd=%.nb.html) $(SOURCES:%.Rmd=%.docx)
    
    %.docx %.nb.html %.html %.pdf: %.Rmd
        Rscript -e "rmarkdown::render('$<', output_format = 'all')"
    
    default: $(TARGET)
    
    clean:
        rm -rf $(TARGET)
    

    【讨论】:

      猜你喜欢
      • 2015-01-16
      • 2020-02-19
      • 2018-02-02
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多