我想使用makefile来更新R代码生成的图形文件. R代码在目录../R中的各种文件中,所有文件以.R结尾.图形文件位于目录../figs中,全部以.pdf或.png结尾.如果R文件的日期比任何图形文件更晚,我想使用该命令处理R文件
R --no-save < file.R
我已经看了一个各种示例makefile,但找不到任何可以适应的东西.
我目前的努力(不工作)如下:
PLOTDIR= ../figs
RDIR= ../R
RFILES= $(RDIR)/*.R
PLOTS= *.pdf *.png
figURES= $(PLOTDIR)/$(PLOTS)
$(figURES): $(RFILES)
R --no-save < $<
解决方法
你可以尝试以下几点.
诀窍是你需要从输入(.R文件)推导出输出
# Makefile
# Beware of indentation when copying use TABS
PLOTDIR = ../figs
RDIR = ../R
# list R files
RFILES = $(wildcard $(RDIR)/*.R)
# compute output file names
PDF_figS = $(RFILES:.R=.pdf)
PNG_figS = $(RFILES:.R=.png)
# relocate files in output folder
OUT_FILES = $(subst $(RDIR),$(PLOTDIR),$(PDF_figS) $(PNG_figS))
# first target is the default: simply do 'make'
all: $(OUT_FILES)
clean:
rm $(OUT_FILES)
.PHONY: all clean
# need to split PNG from PDF rules
$(PLOTDIR)/%.png: $(RDIR)/%.R
R --no-save < $<
$(PLOTDIR)/%.pdf $(PLOTDIR)/%.png: $(RDIR)/%.R
R --no-save < $<
编辑以反映我的评论:每个R脚本使用1个依赖输出文件
PLOTDIR= ../figs
RDIR= ../R
# list R files
RFILES := $(wildcard $(RDIR)/*.R)
# relocate files in output folder
OUT_FILES=$(subst $(RDIR),$(RFILES:.R=.out))
#$(warning $(OUT_FILES))
# first target is the default: simply do 'make'
all: $(OUT_FILES)
clean:
rm $(OUT_FILES)
.PHONY: all clean
$(PLOTDIR)/%.out: $(RDIR)/%.R
R --no-save < $< && touch $@