2012-11-20 12 views
6

मैं एक स्क्रिप्ट है (यह Main.R कहते हैं) ही लगता है जब मैं इसे चलाने के लिए निम्न कोड है:कमांड लाइन से चल रहे आर में एक स्क्रिप्ट कैसे मिल सकती है?

frame_files <- lapply(sys.frames(), function(x) x$ofile) 
frame_files <- Filter(Negate(is.null), frame_files) 
main.dir <- dirname(dirname(frame_files[[length(frame_files)]])) 

यह अपनी निर्देशिका, main.dir है, जो फोन करने के लिए प्रयोग किया जाता है इसके बाद के संस्करण निर्देशिका पाने के लिए प्रयोग किया जाता है इस पथ से संबंधित अन्य स्क्रिप्ट्स।

मैं एक कमांड लाइन से इस स्क्रिप्ट चलाने में दिलचस्पी रहा हूँ, उदाहरण के लिए

R CMD BATCH Main.R 

या

Rscript Main.R 

दुर्भाग्य से, ऊपर बताए गए आदेशों जब मैं आदेश से स्क्रिप्ट फोन काम नहीं करते लाइन।

क्या कोई कोड है जो मैं Main.R में डाल सकता हूं या R या Rscript पर कॉल विकल्प डाल सकता हूं जिसका उपयोग मैं कर सकता हूं?

अधिक विशेष रूप से, समाधान को विंडोज़ में काम करने की आवश्यकता होगी।

+0

क्या इससे मदद मिलती है? http://stackoverflow.com/questions/750786/whats-the-best-way-to-use-r-scripts-on-the-command-line – atomh33ls

+0

निष्पक्ष होने के लिए, मुझे यकीन नहीं है, लेकिन यह ' टी इस तरह दिखता है। मुझे कहना है, मैं कमांड लाइन का उपयोग करने में बहुत अच्छा नहीं हूं। मैंने अपनी पोस्ट को संपादित करने के लिए संपादित किया है कि मैं विंडोज का उपयोग कर रहा हूं, मुझे नहीं पता कि यह जवाब में कोई फर्क पड़ता है या नहीं। कुछ अन्य पोस्ट पढ़ना, मुझे इंप्रेशन # मिल गया है! विंडोज में काम नहीं करता है। – J4y

उत्तर

8

नीचे एक समाधान है कि आप सही फ़ाइल निर्देशिका पथ जब स्क्रिप्ट या तो source के साथ या के साथ चलाया जाता दे देंगे कोड जोड़ Rscript।

# this is wrapped in a tryCatch. The first expression works when source executes, the 
# second expression works when R CMD does it. 
full.fpath <- tryCatch(normalizePath(parent.frame(2)$ofile), # works when using source 
       error=function(e) # works when using R CMD 
        normalizePath(unlist(strsplit(commandArgs()[grep('^--file=', commandArgs())], '='))[2])) 
dirname(full.fpath) 

यह कुंजी normalizePath फ़ंक्शन है। एक सापेक्ष या संक्षिप्त पथ नाम को देखते हुए, normalizePath एक मान्य पथ वापस करेगा या एक त्रुटि उठाएगा। जब आप normalizePath वर्तमान स्क्रिप्ट का मूल फ़ाइल नाम देते हैं, तो स्क्रिप्ट से स्क्रिप्ट चलाते समय, यह आपकी वर्तमान निर्देशिका क्या है, इस पर ध्यान दिए बिना, यह पूर्णपथ वापस कर देगा। जब आप आर सीएमडी के सापेक्ष पथ की आपूर्ति करते हैं तो यह पथ भी सही हो जाता है और वर्तमान निर्देशिका में एक ही नाम के साथ एक स्क्रिप्ट है!

उपरोक्त कोड में, मैं फ़ाइल नाम को commandArgs द्वारा लौटे तारों में से एक से निकालता हूं। यदि आप commandArgs के आउटपुट पर नज़र डालें, तो आप देखेंगे कि फ़ाइल नाम चौथा तर्क है। तर्क '--file = yourscript.R' के रूप में दर्ज किया गया है, इसलिए ऊपर की अंतिम पंक्ति में, मैंने स्ट्रिंग को '=' पर विभाजित किया और फ़ाइल नाम खींच लिया।

+1

+1 - लेकिन अतिरिक्त विकल्प के साथ 'प्रतिलेख' चलाएं, जैसे '--vanilla' और '--file = [...]' कहीं भी समाप्त हो सकता है। '4' जैसे हार्डकोडेड स्थिति का उपयोग करने के बजाय इसे खोजने के लिए 'grep' जैसे फ़ंक्शन का उपयोग करना बुद्धिमान होगा। – flodel

+0

इस पर ध्यान आकर्षित करने के लिए धन्यवाद। ब्रेवटी के लिए इसे बाहर छोड़ दिया। –

+0

@mplourde धन्यवाद! मुझे 'सामान्यीकृत पाथ' से अवगत नहीं था।मुझे यह पसंद है कि आप इसे 'tryCatch' के साथ वहां मिला। – J4y

1

विचार पर अपने Main.R

लिए एक तर्क के रूप पथ देने के लिए मुझे लगता है कि आप RScript से कॉल करने की है।

Rscript Main.R 'path' 
अपने Main.R में

आप तर्क को पढ़ने के लिए

args <- commandArgs(trailingOnly = TRUE) 
mainpath <- as.character(args[1]) 
संबंधित मुद्दे