2009-04-15 4 views
96

È molto comodo avere script R per fare semplici trame dalla riga di comando. Tuttavia, eseguire R da script di bash non è affatto conveniente. L'ideale potrebbe essere qualcosa di simileQual è il modo migliore per utilizzare gli script R sulla riga di comando (terminale)?

#!/path/to/R 
... 

o

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

ma non sono stato in grado di fare uno di questi lavori.

Un'altra opzione è mantenere gli script puramente in R, ad es. script.R e invocandolo con R --file=script.R o simile. Tuttavia, occasionalmente uno script si baserà su interruttori di linea di comando oscuri a cui punto parte del codice esiste al di fuori dello script. Esempio: spostando le cose in R da bash tramite un profilo .RR locale, gli switch desiderati sono quindi tutti --vanilla, ad eccezione di --no-init-file.

Un'altra opzione è uno script bash per archiviare i flag R ed essere eseguibile in modo indolore, che quindi chiama lo script R. Il problema è che questo significa che un singolo programma è stato diviso in due file che ora devono essere sincronizzati, trasferiti a nuove macchine insieme, ecc.

L'opzione che attualmente disprezzo di meno è l'incorporamento della R in uno script bash :

#!/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 

Tutto è in un unico file. È eseguibile e gestisce facilmente argomenti. Il problema è che la combinazione di bash e R in questo modo elimina praticamente la possibilità che nessun IDE fallisca su uno o l'altro e mi fa davvero male al cuore.

C'è qualche modo migliore che mi manca?

risposta

114

Contenuto script.r:

#!/usr/bin/Rscript 

cat("Hello") 

Invocazione da linea di comando:

./script.r 
+1

Sì, penso che questo sia il modo "ufficiale" per farlo. – Frank

+5

E l'esecuzione di 'Rscript --help' dalla riga di comando elenca un sacco di opzioni utili che possono essere aggiunte allo shebang, come' --vanilla'. – flodel

+7

Ricordiamo anche la funzione 'commandArgs' ei pacchetti' getopt' e 'optparse' per analizzare la riga di comando. In modo che gli argomenti e le opzioni possano essere passati agli script anche quando si esegue dalla riga di comando. – flodel

-1

Il seguente funziona per me utilizzando MSYS bash su Windows: non ho R sulla mia macchina Linux, quindi non posso provarlo lì. Hai bisogno di due file - il primo chiamato Funzionam dx esegue R con un parametro del file

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

Hai bisogno di fare questo eseguibile con chmod + x Funzionam dx.

Poi, nel tuo file di script:

#!runr 
# some R commands 
x = 1 
x 

Annotare il #! runr line potrebbe dover includere il percorso completo di runr, a seconda di come si sta usando il comando, come è impostata la variabile PATH.

Non carino, ma sembra funzionare!

+1

E i diversi script R che richiedono parametri diversi? Che ne dici di passare argomenti agli script R dalla riga di comando? – blahdiblah

16

Prova littler. littler fornisce hash-bang (cioè script che inizia con #!/Some/path) per GNU R, così come un semplice uso da riga di comando e piping.

2

Se il programma che si sta utilizzando per eseguire lo script necessita di parametri, è possibile inserirli alla fine del #!Linea:

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

Non sapendo R, non posso testare correttamente, ma questo sembra funzionare:

[email protected]:~$ cat r.test 
#!/usr/bin/R -q -f 
error 
[email protected]:~$ ./r.test 
> #!/usr/bin/R -q -f 
> error 
Error: object "error" not found 
Execution halted 
[email protected]:~$ 
0

si potrebbe desiderare di utilizzare il modulo rpy2 di pitone. Tuttavia, il modo "giusto" per farlo è con R CMD BATCH. È possibile modificare questo per scrivere in STDOUT, ma l'impostazione predefinita è scrivere su un file .Rout. Vedere il seguente esempio:

[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 

Nota: ti consigliamo di provare il --vanilla e altre opzioni per rimuovere tutto il cruft avvio.

8

#!/path/to/R non funziona perché R è esso stesso uno script, quindi execve non è soddisfatto.

Io uso R --slave -f script

+3

Fyi ai lettori occasionali: molte di queste risposte sono pre-date 'Rscript' (e' littler'), nel caso ve lo stiate chiedendo. – michael

9

La risposta di Miguel Sanchez è il modo in cui dovrebbe essere. L'altro modo per eseguire Rscript potrebbe essere il comando 'env' per eseguire il RScript di sistema.

#!/usr/bin/env Rscript 
+1

Non "a livello di sistema", ma piuttosto "env" consentirebbe di eseguire il primo 'Rscript' trovato nel proprio' $ PATH', consentendo in tal modo di eseguire effettivamente _other_ di un 'Rscript di sistema/predefinito ' (che non può essere installato in '/ usr/whatever'). Raccomanderei di usare 'env' per' R' e 'Rscript', dal momento che questi in particolare potrebbero non essere installati in posti standard. (Gli script ordinari di 'bash', tuttavia, tipicamente possono usare sempre in modo sicuro' #!/Bin/bash'.) – michael

0

Prova smallR per la scrittura di script di R veloci nella riga di comando:

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

(r comando nella directory)

Tracciare dalla riga di comando utilizzando smallR sarebbe simile a questa :

r -p file.txt 
+1

Invece di questo (che sembra morto), 'littler' sarebbe sicuramente preferito (dal momento che è ancora vivo); oppure, usa semplicemente 'Rscript' (che in realtà è uscito dopo la creazione di' littler'). – michael

5

Questo funziona,

#!/usr/bin/Rscript 

ma non so cosa succede se sulla macchina è installata più di 1 versione di R.

Se lo fate come questo

#!/usr/bin/env Rscript 

Racconta l'interprete di utilizzare solo ciò che R appare per primo sul vostro cammino.

4

Solo una nota da aggiungere a questo post. Le versioni successive di R sembrano aver sepolto un po 'lo Rscript. Per R 3.1.2-1 su OSX scaricato gennaio 2015 ho trovato Rscript in

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

Così, invece di qualcosa come #! /sw/bin/Rscript, avevo bisogno di utilizzare il seguente nella parte superiore del mio script.

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

Il locate Rscript potrebbe essere utile a voi.

+0

È questa una risposta? – dario

+0

Questa risposta è potenzialmente utile, poiché non è chiara quale piattaforma (* nix o Mac OS) si riferisca all'OP. Con un po 'di rielaborazione (cerca di formattare il codice e rimuovere l'inizio di scusa), questa sarebbe una buona aggiunta alle risposte qui. – BenBarnes

+0

Questo è un altro motivo per usare '#!/Usr/bin/env Rscript' invece di un percorso hard-coded negli script' R' (e aggiungere quel lungo percorso al '$ PATH') – michael