कमांड लाइन (टर्मिनल) पर आर स्क्रिप्ट का उपयोग करने का सबसे अच्छा तरीका क्या है?


115

कमांड लाइन से सरल प्लॉट करने के लिए आर स्क्रिप्ट होना बहुत सुविधाजनक है। हालांकि, बैश स्क्रिप्ट से आर चलाना बिल्कुल भी सुविधाजनक नहीं है। आदर्श कुछ इस तरह हो सकता है

#!/path/to/R
...

या

#!/usr/bin/env R
...

लेकिन मैं उन कामों में से एक भी नहीं कर पाया हूं।

एक अन्य विकल्प लिपियों को विशुद्ध रूप से आर, जैसे script.R, और इसे R --file=script.Rया इसी तरह से लागू करना है । हालांकि, कभी-कभी एक स्क्रिप्ट अस्पष्ट कमांड लाइन स्विच पर निर्भर करेगी, जिस पर स्क्रिप्ट के बाहर कोड के कुछ हिस्से मौजूद हैं। उदाहरण: एक स्थानीय के माध्यम से बैश से आर में छींकने वाली चीजें। लाभकारी, वांछित स्विच हैं तो --vanillaइसके अलावा सब कुछ निहित है --no-init-file

एक अन्य विकल्प आर झंडे को स्टोर करने और दर्द रहित निष्पादन योग्य होने के लिए एक बैश स्क्रिप्ट है, जिसे तब आर स्क्रिप्ट कहते हैं। समस्या यह है कि इसका मतलब है कि एक एकल कार्यक्रम को केवल दो फ़ाइलों में विभाजित किया गया है, जिसे अब सिंक में रखना होगा, नई मशीनों को एक साथ स्थानांतरित करना होगा आदि।

वर्तमान में मैं कम से कम घृणा का विकल्प आर को बैश स्क्रिप्ट में एम्बेड कर रहा हूं:

#!/bin/bash
... # usage message to catch bad input without invoking R
... # any bash pre-processing of input
... # etc
R --random-flags <<RSCRIPT
# R code goes here
RSCRIPT

सब कुछ एक ही फाइल में। यह निष्पादन योग्य है और आसानी से तर्कों को संभालता है। समस्या यह है कि इस तरह से बैश और आर का संयोजन किसी भी आईडीई के एक या दूसरे पर विफल नहीं होने की संभावना को समाप्त करता है, और मेरे दिल को चोट पहुंचाता है।

क्या कोई बेहतर तरीका मुझे याद आ रहा है?

जवाबों:


132

की सामग्री script.r:

#!/usr/bin/env Rscript

args = commandArgs(trailingOnly = TRUE)
message(sprintf("Hello %s", args[1L]))

पहली लाइन शेबंग लाइन है/usr/bin/env Rscriptअपने R इंस्टॉलेशन के पथ को हार्ड-कोड करने के बजाय उपयोग करना सबसे अच्छा अभ्यास है । अन्यथा आप अपनी स्क्रिप्ट को अन्य कंप्यूटरों पर तोड़ने का जोखिम उठाते हैं।

अगला, इसे निष्पादन योग्य बनाएं (कमांड लाइन पर):

chmod +x script.r

कमांड लाइन से मंगलाचरण:

./script.r world
# Hello world

1
हां, मुझे लगता है कि यह ऐसा करने का "आधिकारिक" तरीका है।
फ्रैंक

5
और Rscript --helpकमांड लाइन से चलने से बहुत सारे उपयोगी विकल्प सूचीबद्ध होंगे जो कि शेबंग में जुड़ सकते हैं, जैसे कि --vanilla
फ्लोडेल

8
कमांड लाइन को पार्स करने के लिए commandArgsफ़ंक्शन getoptऔर optparseपैकेजों का भी उल्लेख करते हैं । ताकि कमांड लाइन से चलने पर आपके स्क्रिप्ट में तर्क और विकल्प भी दिए जा सकें।
फ्लोडेल

1
ध्यान दें कि यह केवल तभी काम करता है यदि #!/usr/bin/Rscript(जो R स्क्रिप्ट के लिए मानक अभ्यास नहीं है)।
15

16

लिटलर का प्रयास करें । littlerGNU R के लिए हैश-बैंग (# (! / / / / के साथ शुरू होने वाली स्क्रिप्ट)) और साथ ही सरल कमांड-लाइन और पाइपिंग का उपयोग प्रदान करता है।


10

मिगुएल सांचेज की प्रतिक्रिया वह तरीका है जो इसे होना चाहिए। सिस्टम वाइड आरस्क्रिप्ट को चलाने के लिए रुपये को निष्पादित करने का दूसरा तरीका 'env' कमांड हो सकता है।

#!/usr/bin/env Rscript

1
"सिस्टम-वाइड" नहीं है, बल्कि envआपको Rscriptअपने आप में पाए गए पहले को चलाने की अनुमति देगा $PATH, इस प्रकार एक को वास्तव में सिस्टम-वाइड / डिफ़ॉल्ट (जो स्थापित नहीं हो सकता है ) के अलावा कुछ और चलाने की अनुमति देता है । मैं विशेष रूप से मानक स्थानों में स्थापित नहीं किया जा सकता है, क्योंकि मैं और सामान के लिए उपयोग करने की सलाह दूंगा। (साधारण स्क्रिप्ट आमतौर पर सुरक्षित रूप से हमेशा उपयोग कर सकते हैं ।)Rscript/usr/whateverenvRRscriptbash#!/bin/bash
माइकल

@michael नहीं, आप बैश के विषय में गलत हैं, और यह खतरनाक सलाह है। केवल एक चीज जिसे सुरक्षित रूप से हार्ड-कोड किया जा सकता है /bin/sh। बाकी सब कुछ envलुकअप का उपयोग करना चाहिए । विशेष रूप से, अधिक बार बाश न करें गणना समूहों पर पुराना है और उपयोगकर्ताओं के पास अपने स्वयं के कस्टम इंस्टॉलेशन हैं (आमतौर पर एनएफएस माउंट ~/.local/binजैसे कुछ में साझा किया जाता है /software)। इसी तरह, MacOS पर, /bin/bashहै हमेशा कारण मुद्दों लाइसेंस के लिए पुराना है, और एक तारीख बैश अधिक सामान्यतः पर स्थित है /usr/local/bin/bash(मुझे पता है अपनी टिप्पणी 3 साल पुराना है, लेकिन यह काफी महत्वपूर्ण है।)
कोनराड रूडोल्फ

नहीं, क्षमा करें, यह सच नहीं है। आप इस मामले पर एक मजबूत राय हैं, हालांकि, मैं इस मुद्दे पर बहस नहीं करूंगा। यदि उपयोग /bin/shकरना, किसी भी परिस्थिति में, "खतरनाक" भी नहीं है, तो आपको स्वीकार करना होगा उसी के लिए कहा जा सकता है /bin/bash। अलग-अलग उपयोगकर्ताओं envके लिए विश्वसनीय / असंगत PATHसेटिंग्स के कारण उपयोग करना अधिक अप्रत्याशित है, लेकिन प्रत्येक आर उपयोगकर्ता वास्तव में यह व्यवहार चाहते हैं, जबकि bashस्क्रिप्ट नहीं करते हैं। अंत में, सीआई / क्लाउड नए बैश स्क्रिप्ट को लागू करने के लिए, बस उन्हें उपयोग करके /path/to/my/bash myscriptया स्पष्ट रूप से पथ सेट करें और उनका उपयोग करके आह्वान करें env script। EOT
माइकल

9

#!/path/to/Rकाम नहीं करेगा क्योंकि R स्वयं एक स्क्रिप्ट है, इसलिए execveदुखी है।

मैं उपयोग करता हूं R --slave -f script


4
आकस्मिक पाठकों के लिए फी: इनमें से बहुत सारे उत्तर पूर्व-तारीख Rscript(और littler), यदि आप सोच रहे हैं।
माइकल

@michael का कोई भी उत्तर यहाँ रुपये से पहले का नहीं है, जिसे 2007 में R 2.5.0 के साथ रिलीज़ किया गया था।
कोनराड रुडोल्फ

6

यदि आप एक आर स्क्रिप्ट के लिए कमांड लाइन तर्कों को पार्स करने में रुचि रखते हैं, तो आरएसस्क्रिप्ट की कोशिश करें जो कि संस्करण 2.5.x के रूप में आर के साथ बंडल है।

http://stat.ethz.ch/R-manual/R-patched/library/utils/html/Rscript.html


4

यह काम,

#!/usr/bin/Rscript

लेकिन मुझे नहीं पता कि आपके मशीन पर आर के 1 से अधिक संस्करण होने पर क्या होता है।

अगर आप इसे इस तरह करते हैं

#!/usr/bin/env Rscript

यह दुभाषिया को बताता है कि जो भी आर आपके मार्ग पर पहली बार दिखाई देता है उसका उपयोग करें।


2

यदि आप अपनी स्क्रिप्ट को निष्पादित करने के लिए प्रोग्राम का उपयोग कर रहे हैं, तो पैरामीटर की आवश्यकता है, आप उन्हें # के अंत में रख सकते हैं! रेखा:

#!/usr/bin/R --random --switches --f

आर को न जानते हुए, मैं ठीक से परीक्षण नहीं कर सकता, लेकिन यह काम करने लगता है:

axa@artemis:~$ cat r.test
#!/usr/bin/R -q -f
error
axa@artemis:~$ ./r.test
> #!/usr/bin/R -q -f
> error
Error: object "error" not found
Execution halted
axa@artemis:~$

2

इस पोस्ट में जोड़ने के लिए बस एक नोट। बाद के संस्करण कुछ हद तक Rदबे हुए प्रतीत होते हैं Rscript। OSX पर R 3.1.2-1 के लिए जनवरी 2015 को मैंने डाउनलोड Rscriptकिया

/sw/Library/Frameworks/R.framework/Versions/3.1/Resources/bin/Rscript

इसलिए, जैसे कुछ के बजाय #! /sw/bin/Rscript, मुझे अपनी स्क्रिप्ट के शीर्ष पर निम्नलिखित का उपयोग करने की आवश्यकता थी।

#! /sw/Library/Frameworks/R.framework/Versions/3.1/Resources/bin/Rscript

आपके locate Rscriptलिए मददगार हो सकता है।


यह उत्तर संभावित रूप से सहायक है, क्योंकि यह स्पष्ट नहीं है कि ओपी किस प्लेटफ़ॉर्म (* निक्स या मैक ओएस) को संदर्भित करता है। थोड़े से फिर से काम करने के लिए (कोड को प्रारूपित करने और माफी की शुरुआत को हटाने के लिए देखें), यह यहां के जवाबों के लिए एक अच्छा अतिरिक्त होगा।
बेनबर्न

2
स्क्रिप्ट #!/usr/bin/env Rscriptमें एक कठिन-कोडित पथ के बजाय इसका उपयोग करने का एक और कारण है R(और उस लंबे पथ को अपने साथ जोड़ें $PATH)
माइकल

0

आप अजगर के rpy2 मॉड्यूल का उपयोग करना चाह सकते हैं। हालांकि, ऐसा करने का "सही" तरीका आर सीएमडी बैच के साथ है। आप इसे STDOUT पर लिखने के लिए संशोधित कर सकते हैं, लेकिन डिफ़ॉल्ट को .Rout फ़ाइल में लिखना है। नीचे उदाहरण देखें:

[ramanujan:~]$cat foo.R
print(rnorm(10))
[ramanujan:~]$R CMD BATCH foo.R
[ramanujan:~]$cat foo.Rout

R version 2.7.2 (2008-08-25)
Copyright (C) 2008 The R Foundation for Statistical Computing
ISBN 3-900051-07-0

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

[Previously saved workspace restored]


 ~/.Rprofile loaded.
Welcome at  Fri Apr 17 13:33:17 2009
> print(rnorm(10))
 [1]  1.5891276  1.1219071 -0.6110963  0.1579430 -0.3104579  1.0072677 -0.1303165  0.6998849  1.9918643 -1.2390156
>

Goodbye at  Fri Apr 17 13:33:17 2009
> proc.time()
   user  system elapsed
  0.614   0.050   0.721

नोट: आप सभी स्टार्टअप क्रुट को हटाने के लिए --vanilla और अन्य विकल्पों को आज़माना चाहेंगे।


0

कमांड लाइन में त्वरित R स्क्रिप्ट लिखने के लिए छोटे-छोटे प्रयास करें:

http://code.google.com/p/simple-r/

( rनिर्देशिका में कमांड)

छोटे पंक्ति का उपयोग करके कमांड लाइन से प्लॉटिंग इस तरह दिखाई देगी:

r -p file.txt

2
इसके बजाय (जो मृत लगता है), littlerनिश्चित रूप से पसंद किया जाएगा (क्योंकि यह अभी भी जीवित है); या, बस उपयोग करें Rscript(जो वास्तव में बाहर आने के बाद littlerबनाया गया था।)
माइकल

-1

मेरे लिए विंडोज पर MSYS बैश का उपयोग करने के लिए निम्नलिखित काम करता है - मेरे पास मेरे लिनक्स बॉक्स पर R नहीं है इसलिए इसे वहां नहीं आज़मा सकते। आपको दो फ़ाइलों की आवश्यकता है - पहला जिसे रनर कहा जाता है वह एक फ़ाइल पैरामीटर के साथ आर निष्पादित करता है

# this is runr
# following is path to R on my Windows machine
# plus any R params you need
c:/r/bin/r --file=$1

आपको इस निष्पादनयोग्य को chmod + x runr के साथ बनाने की आवश्यकता है ।

फिर आपकी स्क्रिप्ट फ़ाइल में:

#!runr
# some R commands
x = 1
x

ध्यान दें #! runr लाइन में runr के लिए पूर्ण पथ को शामिल करने की आवश्यकता हो सकती है, यह इस बात पर निर्भर करता है कि आप कमांड का उपयोग कैसे कर रहे हैं, आपका पैठ चर कैसे है।

सुंदर नहीं है, लेकिन यह काम करने लगता है!


1
विभिन्न मापदंडों के लिए अलग-अलग R लिपियों की क्या आवश्यकता है? कमांड लाइन से आर स्क्रिप्ट के लिए तर्क पारित करने के बारे में क्या?
१०:३६ पर ०६ बजे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.