Qual è il modo migliore per utilizzare gli script R sulla riga di comando (terminale)?


115

È molto comodo avere script R per eseguire semplici grafici dalla riga di comando. Tuttavia, eseguire R da script bash non è affatto conveniente. L'ideale potrebbe essere qualcosa di simile

#!/path/to/R
...

o

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

ma non sono stato in grado di far funzionare nessuno di questi.

Un'altra opzione è mantenere gli script esclusivamente in R, ad esempio script.R, e invocarli con R --file=script.Ro simili. Tuttavia, occasionalmente uno script si baserà su oscure opzioni della riga di comando a quel punto parte del codice esiste al di fuori dello script. Esempio: introducendo di nascosto cose in R da bash tramite un .Rprofile locale, le opzioni desiderate sono quindi tutto ciò che --vanillaimplica tranne --no-init-file.

Un'altra opzione è uno script bash per memorizzare 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 appena diviso in due file che ora devono essere mantenuti sincronizzati, trasferiti su nuove macchine insieme, ecc.

L'opzione che attualmente disprezzo meno è incorporare la 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 gli argomenti. Il problema è che combinare bash e R in questo modo elimina praticamente la possibilità che qualsiasi IDE non fallisca nell'uno o nell'altro e mi fa davvero male il cuore.

C'è un modo migliore che mi manca?

Risposte:


132

Contenuto di script.r:

#!/usr/bin/env Rscript

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

La prima riga è la riga shebang . È consigliabile utilizzare /usr/bin/env Rscriptinvece di codificare in modo rigido il percorso dell'installazione R. Altrimenti rischi di rompere lo script su altri computer.

Quindi, rendilo eseguibile (sulla riga di comando):

chmod +x script.r

Invocazione dalla riga di comando:

./script.r world
# Hello world

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

5
E l'esecuzione Rscript --helpdalla riga di comando elencherà molte opzioni utili che possono essere aggiunte allo shebang, come --vanilla.
flodel

8
Menzioniamo anche la commandArgsfunzione e i pacchetti getopte optparseper analizzare la riga di comando. In modo che gli argomenti e le opzioni possano essere passati anche agli script durante l'esecuzione dalla riga di comando.
flodel

1
Si noti che questo funziona solo se #!/usr/bin/Rscript(che non è la pratica standard per gli script R).
gented

16

Prova più piccolo . littlerfornisce funzionalità hash-bang (cioè script che iniziano con #! / some / path) per GNU R, così come semplice riga di comando e utilizzo di piping.


10

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

#!/usr/bin/env Rscript

1
Non "a livello di sistema", ma piuttosto envti permetterebbe di eseguire il primo Rscripttrovato nel tuo $PATH, consentendo così di eseguire effettivamente qualcosa di diverso da un sistema / predefinito Rscript(che potrebbe non essere installato in /usr/whatever). Consiglierei di usare envfor Re Rscriptstuff, poiché questi in particolare potrebbero non essere installati in posizioni standard. (Gli bashscript ordinari tuttavia possono in genere essere sempre utilizzati in modo sicuro #!/bin/bash.)
michael

@michael No, ti sbagli riguardo a Bash, e questo è un consiglio pericoloso. L'unica cosa che può essere codificata in modo sicuro è /bin/sh. Tutto il resto deve utilizzare la envricerca. In particolare, il più delle volte Bash è obsoleto sui cluster di elaborazione e gli utenti hanno le proprie installazioni personalizzate (comunemente in ~/.local/bino condivise in qualcosa di simile a un /softwaremontaggio NFS). Allo stesso modo, su macOS, /bin/bashè sempre obsoleto a causa di problemi di licenza e un Bash aggiornato si trova più comunemente in /usr/local/bin/bash(mi rendo conto che il tuo commento ha 3 anni ma questo è abbastanza importante.)
Konrad Rudolph

No, scusa, semplicemente non è vero. Tuttavia, hai una forte opinione in merito, quindi non discuterò la questione. Se l'utilizzo /bin/shè, in ogni caso, non anche "pericoloso", allora bisogna ammettere che si potrebbe dire lo stesso /bin/bash. L'utilizzo envè più imprevedibile, a causa di PATHimpostazioni affidabili / incoerenti per utenti diversi, ma ogni utente R potrebbe effettivamente volere questo comportamento, mentre gli bashscript no. Infine, per CI / cloud che richiama script bash più recenti, è sufficiente richiamarli utilizzando /path/to/my/bash myscripto impostare esplicitamente il percorso e richiamarli utilizzando env script. EOT
michael

9

#!/path/to/Rnon funzionerà perché R è esso stesso uno script, quindi execveè infelice.

Io uso R --slave -f script


4
Cordiali saluti ai lettori occasionali: molte di queste risposte sono precedenti Rscript(e littler), nel caso ve lo stiate chiedendo.
michael

@michael Nessuna delle risposte qui è precedente a Rscript, che è stato rilasciato nel 2007 con R 2.5.0.
Konrad Rudolph


4

Questo funziona

#!/usr/bin/Rscript

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

Se lo fai in questo modo

#!/usr/bin/env Rscript

dice all'interprete di usare solo qualunque R appare per primo sul tuo percorso.


2

Se il programma che stai usando per eseguire lo script necessita di parametri, puoi metterli alla fine del #! linea:

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

Non conoscendo R, non posso testare correttamente, ma sembra funzionare:

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

Solo una nota da aggiungere a questo post. Le versioni successive di Rsembrano essere Rscriptun po ' sepolte . Per R 3.1.2-1 su OSX scaricato a gennaio 2015 ho trovato Rscriptin

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

Quindi, invece di qualcosa del genere #! /sw/bin/Rscript, dovevo usare quanto segue all'inizio del mio script.

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

Il locate Rscriptpotrebbe essere utile a voi.


Questa risposta è potenzialmente utile, poiché non è chiaro a quale piattaforma (* nix o Mac OS) si riferisce l'OP. Con un po 'di rielaborazione (guarda al formato del codice e rimuovi l'inizio delle scuse), questa sarebbe una buona aggiunta alle risposte qui.
BenBarnes

2
Questo è un altro motivo per utilizzare al #!/usr/bin/env Rscriptposto di un percorso hardcoded negli Rscript (e aggiungere quel percorso lungo al tuo $PATH)
michael

0

Potresti voler usare il modulo rpy2 di python. Tuttavia, il modo "giusto" per farlo è con R CMD BATCH. È possibile modificarlo per scrivere in STDOUT, ma l'impostazione predefinita è scrivere in un file .Rout. Vedi esempio sotto:

[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 --vanilla e altre opzioni per rimuovere tutto il cruft di avvio.


0

Prova smallR per scrivere script R rapidi nella riga di comando:

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

( rcomando nella directory)

La stampa dalla riga di comando utilizzando smallR sarebbe simile a questa:

r -p file.txt

2
Piuttosto che questo (che sembra morto), littlersarebbe sicuramente preferito (visto che è ancora vivo); oppure, basta usare Rscript(che in realtà è uscito dopo la littlercreazione.)
michael

-1

Quanto segue funziona per me usando MSYS bash su Windows: non ho R sulla mia macchina Linux, quindi non posso provarlo lì. Hai bisogno di due file: il primo chiamato runr esegue R con un parametro 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

Devi rendere questo eseguibile con chmod + x runr .

Quindi nel tuo file di script:

#!runr
# some R commands
x = 1
x

Notare la #! La riga runr potrebbe dover includere il percorso completo di runr, a seconda di come si utilizza il comando, di come è impostata la variabile PATH, ecc.

Non è carino, ma sembra funzionare!


1
E i diversi script R che richiedono parametri diversi? Che dire del passaggio di argomenti agli script R dalla riga di comando?
blahdiblah
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.