10

Makefile を使用して、R コードによって生成された Figure ファイルを更新したいと考えています。R コードはディレクトリ内のさまざまなファイルにあり../R、すべて.R. Figure ファイルはディレクトリ内にあり、すべてまたは../figsで終わります。R ファイルの日付がどの図ファイルよりも新しい場合、次のコマンドで R ファイルを処理したい.pdf.png

R --no-save < file.R

さまざまなメイクファイルの例を調べましたが、適応できるものは見つかりませんでした。

私の現在の取り組み(機能していない)は次のとおりです。

PLOTDIR= ../figs
RDIR= ../R
RFILES= $(RDIR)/*.R
PLOTS= *.pdf *.png
FIGURES= $(PLOTDIR)/$(PLOTS)
$(FIGURES): $(RFILES)
    R --no-save < $<
4

2 に答える 2

2

以下を試すことができます。

秘訣は、入力 (.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), $(PLOTDIR), $(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 $@
于 2012-10-19T08:46:05.927 に答える
1

興味深い問題。論理的には単純ですが、Makeがやりたいことの本質に反しています。

これはうまくいくようです。これは、パターンルールのあいまいな機能に依存しています。パターンルールに複数のターゲットがある場合、Makeは、すべてのターゲットを更新するために1回だけ実行する必要があると推測します。

PLOTDIR = ../figs
RDIR = ../R
RFILES = $(wildcard $(RDIR)/*.R)
FIGURES = $(wildcard $(PLOTDIR)/*.pdf $(PLOTDIR)/*.png)

all: $(FIGURES)

$(PLOTDIR)/%.pdf $(PLOTDIR)/%.png: $(RFILES)
        @for x in $?; do R --no-save \< $$x; done
于 2012-10-19T08:53:50.373 に答える