2012-10-19 20 views
10

मैं आर कोड द्वारा जेनरेट की गई आकृति फ़ाइलों को अद्यतन करने के लिए मेकफ़ाइल का उपयोग करना चाहता हूं। आर कोड निर्देशिका ../R में विभिन्न फाइलों में है और सभी .R में समाप्त हो रहे हैं। आकृति फाइलें ../figs निर्देशिका में हैं और सभी .pdf या .png में समाप्त हो रही हैं। एक अनुसंधान फ़ाइल आंकड़ा फ़ाइलों में से किसी की तुलना में एक बाद की तारीख है, मुझे आदेशएकाधिक इनपुट और आउटपुट के साथ मेकफ़ाइल

R --no-save < file.R 

साथ आर फ़ाइल पर कार्रवाई करने मैं एक विभिन्न उदाहरण makefiles देखा लेकिन कुछ भी मैं खुद को अनुकूलित कर नहीं पा सके चाहते हैं।

मेरे वर्तमान प्रयास (काम नहीं कर रहा) इस प्रकार है:

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

तुम क्यों उपयोग नहीं करते हैं 'बजाय Rscript file.R'' आर --no-बचाने rinni

+0

क्या आर फाइलों के नाम और आकृति फ़ाइलों के नामों के बीच कोई संबंध है? – Beta

+1

@rinni। कोई विशेष कारण नहीं है। वह भी काम करेगा। –

उत्तर

2

आप निम्नलिखित कोशिश कर सकते हैं।

चाल है कि आप इनपुट से उत्पादन अनुमान करने की जरूरत है (आर फ़ाइल) कर रहे हैं

# 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 < $< 

संपादित मेरी टिप्पणी को प्रतिबिंबित करने के: आर स्क्रिप्ट प्रति उपयोग 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 [email protected] 
+0

मुझे नहीं लगता कि यह काम करेगा। 'OUT_FILES' के नाम गलत हैं, इसलिए, सामान्य रूप से, हर बार प्रत्येक आर फ़ाइल चलाएंगे। – Beta

+0

@ बीट: मैंने नियम तय किए हैं। केवल समस्या का सामना करना यह है कि हम नहीं जानते कि पीडीएफ या पीएनजी जारी किया गया है (या दोनों)। एक समाधान 'टच' का उपयोग करके एक आर स्क्रिप्ट से केवल एक आउटपुट फ़ाइल (i.e ../figs/%.out) बनाना है (साथ ही वास्तव में चित्र फ़ाइल उत्पन्न करना)। – levif

+0

धन्यवाद। आपकी दूसरी फाइल ने वही किया जो मुझे चाहिए था, भले ही यह बिल्कुल ठीक नहीं था! –

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 
+0

जो मैं चाहता हूं (\ <द्वारा प्रतिस्थापित <) के साथ। हालांकि, यह मेरे विचार के साथ एक तर्क समस्या का खुलासा करता है। अगर file1.R एक पीडीएफ और file2.R उत्पन्न करता है b.pdf उत्पन्न करता है, तो जब file2.R अद्यतन होता है, तो हमेशा इसे चलाने की कोशिश करेंगे क्योंकि एक.pdf पुराना है और ऐसा ही रहता है। मुझे लगता है कि मुझे यह निर्दिष्ट करने की आवश्यकता होगी कि कौन सी आर फाइलें पीडीएफ/पीएनजी फाइलों के अनुरूप हैं। –

+1

@ बीटा: यदि कोई आंकड़ा पहले से मौजूद नहीं है तो क्या होगा? फिगर खाली है और कुछ भी नहीं किया जाता है। – levif

+0

@RobHyndman जिसके ऊपर बेहतर नियंत्रण होता है। फाइलें कौन से आंकड़े उत्पन्न करती हैं, आप रेसिपी घोषणा से प्रीरेक्स घोषणा को अलग कर सकते हैं। ऐसा करने के लिए, काम करने के लिए एक सामान्य नुस्खा (यानी, नुस्खा से $ (आरएफआईएलएस) हटाएं), और प्रत्येक लक्ष्य (आकृति) के लिए prereqs एक नुस्खा घोषणा लाइनों पर हो सकता है। हम्म; यकीन नहीं है कि वह $ के साथ काम करेगा? स्वचालित चर; ये हो सकता है। –

संबंधित मुद्दे