comandos - ejecutar bash linux
¿Cuál es la mejor manera de utilizar los scripts R en la línea de comandos(terminal)? (12)
Es muy conveniente tener scripts R para hacer gráficas simples desde la línea de comando. Sin embargo, ejecutar R desde los scripts bash no es conveniente en absoluto. El ideal podría ser algo así como
#!/path/to/R
...
o
#!/usr/bin/env R
...
pero no he podido hacer ninguno de esos trabajos.
Otra opción es mantener los scripts puramente en R, por ejemplo script.R
, e invocarlo 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 las banderas R y ser ejecutable fácilmente, que luego llama al guión R. El problema es que esto significa que un solo programa acaba de dividirse en dos archivos que ahora tienen que mantenerse sincronizados, transferirse a máquinas nuevas, etc.
La opción que actualmente menosprecio es incorporar el R en un 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
Todo está 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 estoy perdiendo?
¿Alguna vez sabe que puede usar su navegador para usar RStudio en el servidor?
Contenido de script.r
:
#!/usr/bin/Rscript
cat("Hello")
Invocación de línea de comando:
./script.r
Es posible que desee utilizar el módulo rpy2 de python. 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. Vea 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: querrá probar la --vanilla y otras opciones para eliminar todo el cruft de inicio.
Esto funciona,
#!/usr/bin/Rscript
pero no sé qué sucederá si tiene más de 1 versión de R instalada en su máquina.
Si lo haces así
#!/usr/bin/env Rscript
le dice al intérprete que simplemente use cualquier R que aparezca primero en su ruta.
La respuesta de Miguel Sánchez 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
Lo siguiente funciona para mí usando MSYS bash en Windows: no tengo R en mi cuadro de Linux, así que no puedo probarlo allí. Necesita dos archivos: el primero llamado runr 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
Necesitas hacer este ejecutable con chmod + x runr .
Luego en tu archivo de script:
#!runr
# some R commands
x = 1
x
Nota la #! La línea runr puede necesitar incluir la ruta completa a runr, dependiendo de cómo esté usando el comando, cómo se establece su variable PATH, etc.
¡No es bonito, pero parece funcionar!
Prueba littler . littler
proporciona la función hash-bang (es decir, script que comienza con #! / some / path) para GNU R, así como el uso simple de línea de comandos y tuberías.
Pruebe smallR para escribir scripts R rápidos en la línea de comando:
http://code.google.com/p/simple-r/
(comando r
en el directorio)
Trazar desde la línea de comando usando smallR se vería así:
r -p file.txt
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 puedo realizar pruebas correctamente, pero parece que funciona:
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:~$
Si le interesa analizar los argumentos de la línea de comando en un script R, pruebe con el comando RScript, que se incluye con R a partir de la versión 2.5.x.
http://stat.ethz.ch/R-manual/R-patched/library/utils/html/Rscript.html
Solo una nota para agregar a esta publicación. Las versiones posteriores de R
parecen haber enterrado algo a Rscript
. Para R 3.1.2-1 en OSX descargado en enero de 2015 encontré Rscript
en
/sw/Library/Frameworks/R.framework/Versions/3.1/Resources/bin/Rscript
Entonces, ¡en lugar de algo como #! /sw/bin/Rscript
#! /sw/bin/Rscript
, necesitaba usar lo siguiente en la parte superior de mi script.
#! /sw/Library/Frameworks/R.framework/Versions/3.1/Resources/bin/Rscript
El locate Rscript
puede ser útil para usted.
#!/path/to/R
no funcionará porque R es en sí mismo un script, por lo que execve
está contento.
Yo uso R --slave -f script