2009-04-15 25 views
96

Es muy conveniente tener scripts R para hacer gráficas simples desde la línea de comandos. Sin embargo, ejecutar R desde los scripts bash no es conveniente en absoluto. El ideal podría ser algo así como¿Cuál es la mejor manera de usar los scripts R en la línea de comandos (terminal)?

#!/path/to/R 
... 

o

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

pero no he sido capaz de hacer cualquiera de los trabajos.

Otra opción es mantener las secuencias de comandos puramente en R, p. Ej. script.R, e invocándolo con R --file=script.R o similar. Sin embargo, de vez en cuando una secuencia de comandos se basará en interruptores de línea de comando oscuros en cuyo punto parte del código existe fuera de la secuencia de comandos. Ejemplo: introducir cosas furtivamente en R desde bash a través de un .Rprofile local, los switches deseados son entonces todo --vanilla implica excepto --no-init-file.

Otra opción es una secuencia de comandos bash para almacenar los indicadores R y ser ejecutable fácilmente, que luego llama al script R. El problema es que esto significa que un solo programa acaba de ser dividido en dos archivos que ahora tiene que mantenerse en sincronía, transferidos a nuevas máquinas juntas, etc.

la opción actualmente Desprecio menos está incorporando la R en una escritura del golpe :

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

Todo en un solo archivo. Es ejecutable y maneja fácilmente los argumentos. El problema es que combinar bash y R como este elimina la posibilidad de que cualquier IDE no falle en uno u otro, y hace que mi corazón duela realmente mal.

¿Hay alguna forma mejor en la que me pierdo?

Respuesta

114

contenido de script.r:

#!/usr/bin/Rscript 

cat("Hello") 

Invocación desde la línea de comandos:

./script.r 
+1

Sí, creo que esta es la manera "oficial" de hacerlo. – Frank

+5

Y al ejecutar 'Rscript --help' desde la línea de comandos se enumerarán muchas opciones útiles que se pueden agregar al shebang, como' --vanilla'. – flodel

+7

Mencionemos también la función 'commandArgs' y los paquetes' getopt' y 'optparse' para analizar la línea de comando. De modo que los argumentos y las opciones también se pueden pasar a sus scripts cuando se ejecutan desde la línea de comandos. – flodel

-1

Lo siguiente me funciona usando MSYS bash en Windows: no tengo R en mi cuadro de Linux, así que no puedo probarlo allí. Se necesitan dos ficheros - la primera llamada Dcha ejecuta R con un parámetro de archivo

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

que necesita para hacer de este ejecutable con chmod + x Dcha.

Luego, en el archivo de script:

#!runr 
# some R commands 
x = 1 
x 

Nota del #! La línea runr puede necesitar incluir la ruta completa a runr, dependiendo de cómo está usando el comando, cómo está configurada la variable PATH, etc.

No es bonita, pero parece funcionar.

+1

¿Qué hay de diferentes scripts R que necesitan diferentes parámetros? ¿Qué hay de pasar argumentos a los scripts R desde la línea de comandos? – blahdiblah

16

Probar littler. littler proporciona hash-bang (es decir, secuencia de comandos que comienza con la capacidad #!/Some/path) para GNU R, así como el uso simple de línea de comandos y tuberías.

2

Si el programa que está utilizando para ejecutar su script necesita parámetros, ¡puede ponerlos al final del #!línea:

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

Sin saber R, no se puede probar correctamente, pero esto parece que funciona:

[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

Es posible que desee utilizar el módulo rpy2 de pitón. Sin embargo, la forma "correcta" de hacerlo es con R CMD BATCH. Puede modificar esto para escribir en STDOUT, pero el valor predeterminado es escribir en un archivo .Rout. Consulte el siguiente ejemplo:

[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: usted querrá probar el --vanilla y otras opciones para eliminar toda la costra de inicio.

8

#!/path/to/R no funciona porque R es en sí mismo una secuencia de comandos, por lo que execve no está contento.

utilizo R --slave -f script

+3

Fyi para lectores informales: muchas de estas respuestas son anteriores a 'Rscript' (y' littler'), en caso de que se lo esté preguntando. – michael

9

La respuesta de Miguel Sanchez es la forma en que debería ser. La otra forma de ejecutar Rscript podría ser el comando 'env' para ejecutar el sistema completo de RScript.

#!/usr/bin/env Rscript 
+1

No "todo el sistema", sino más bien 'env' le permitiría ejecutar el primer' Rscript' encontrado en su propia '$ PATH', permitiendo así que realmente ejecute algo _other_ que un sistema completo * Rscript' (que no puede instalarse en '/ usr/whatever'). Yo recomendaría usar 'env' para cosas' R' y 'Rscript', ya que estos en particular pueden no instalarse en lugares estándar. (Sin embargo, los scripts ordinarios 'bash' normalmente siempre pueden usar' '#!/Bin/bash'.) – michael

0

Trate smallR para la escritura de guiones R rápidos en la línea de comandos:

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

(r comando en el directorio)

El trazado de la línea de comandos usando smallR sería el siguiente :

r -p file.txt 
+1

En lugar de esto (que parece estar muerto),' littler' ciertamente sería preferido (dado que aún está activo); o, simplemente use 'Rscript' (que en realidad salió después de que se creó' littler'.) – michael

5

Esto funciona,

#!/usr/bin/Rscript 

pero no sé lo que pasa si usted tiene más de 1 versión de R instalado en su máquina.

Si haces así

#!/usr/bin/env Rscript 

le dice al intérprete que acaba de utilizar cualquier R aparece por primera vez en su trayectoria.

4

Solo una nota para agregar a esta publicación. Las versiones posteriores de R parecen haber enterrado algo de Rscript. Para R 3.1.2-1 en OSX descargado Ene el año 2015 me encontré en Rscript

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

Así, en lugar de algo así como #! /sw/bin/Rscript, que necesitaba usar lo siguiente en la parte superior de mi guión.

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

El locate Rscript podría ser útil para usted.

+0

¿Esto es una respuesta? – dario

+0

Esta respuesta es potencialmente útil, ya que no está claro a qué plataforma (* nix o Mac OS) se refiere el OP. Con un poco de nuevo trabajo (mira para formatear el código y eliminar el comienzo apologético), esto sería una buena adición a las respuestas aquí. – BenBarnes

+0

Esta es otra razón para usar '#!/Usr/bin/env Rscript' en lugar de una ruta codificada en' R' scripts (y agregar esa larga ruta a su '$ PATH') – michael

Cuestiones relacionadas