Es muy conveniente tener scripts en R para realizar trazados simples desde la línea de comandos. Sin embargo, ejecutar R desde scripts bash no es nada conveniente. El ideal podría ser algo como
#!/path/to/R
...
o
#!/usr/bin/env R
...
pero no he podido hacer que ninguno de esos funcione.
Otra opción es mantener los scripts puramente en R, por ejemplo script.R
, e invocarlos con R --file=script.R
o similar. Sin embargo, ocasionalmente un script se basará en cambios de línea de comando oscuros en cuyo punto parte del código existe fuera del script. Ejemplo: infiltrar cosas en R desde bash a través de un .Rprofile local, los interruptores deseados son entonces todo --vanilla
implica excepto --no-init-file
.
Otra opción es un script bash para almacenar los indicadores R y ser ejecutable sin dolor, que luego llama al script R. El problema es que esto significa que un solo programa acaba de dividirse en dos archivos que ahora deben mantenerse sincronizados, transferidos a nuevas máquinas juntos, etc.
La opción que menos desprecio actualmente es incrustar la 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 argumentos fácilmente. El problema es que combinar bash y R de esta manera elimina prácticamente la posibilidad de que cualquier IDE no falle en uno u otro, y hace que mi corazón duela mucho.
¿Hay alguna forma mejor que me esté perdiendo?
Rscript --help
desde la línea de comando, se enumerarán muchas opciones útiles que se pueden agregar al shebang, como--vanilla
.commandArgs
función y los paquetesgetopt
yoptparse
para analizar la línea de comandos. Para que los argumentos y las opciones también se puedan pasar a sus scripts cuando se ejecutan desde la línea de comandos.#!/usr/bin/Rscript
(que no es la práctica estándar para los scripts de R).Intente más pequeño .
littler
proporciona la capacidad de hash-bang (es decir, un script que comienza con #! / some / path) para GNU R, así como un uso simple de la línea de comandos y la canalización.fuente
La respuesta de Miguel Sánchez es como debe ser. La otra forma de ejecutar Rscript podría ser el comando 'env' para ejecutar el RScript en todo el sistema.
fuente
env
le permitiría ejecutar el primero que seRscript
encuentre en el suyo$PATH
, lo que le permitirá ejecutar algo que no sea en todo el sistema / predeterminadoRscript
(que puede no estar instalado/usr/whatever
). Recomendaría usarenv
forR
andRscript
stuff, ya que estos en particular pueden no estar instalados en lugares estándar. (Ordinariasbash
guiones sin embargo pueden utilizar con seguridad por lo general siempre#!/bin/bash
.)/bin/sh
. Todo lo demás debe usar laenv
búsqueda. En particular, la mayoría de las veces Bash está desactualizado en los clústeres de computación y los usuarios tienen sus propias instalaciones personalizadas (comúnmente en~/.local/bin
o compartidas en algo como un/software
montaje NFS). Del mismo modo, en macOS, siempre/bin/bash
está desactualizado debido a problemas de licencia, y un Bash actualizado se encuentra más comúnmente en (me doy cuenta de que su comentario tiene 3 años, pero esto es bastante importante)./usr/local/bin/bash
/bin/sh
es, en cualquier circunstancia, también "peligroso", entonces debe admitir que podría decirse lo mismo/bin/bash
. El usoenv
es más impredecible, debido aPATH
configuraciones confiables / inconsistentes para diferentes usuarios, pero cada usuario de R puede querer este comportamiento, mientras que losbash
scripts no. Por último, para CI / nube que invoca scripts de bash más nuevos, simplemente invocalos usando/path/to/my/bash myscript
o establece explícitamente la ruta e invocalos usandoenv script
. EOT#!/path/to/R
no funcionará porque R es en sí mismo un script, por lo queexecve
es infeliz.yo suelo
R --slave -f script
fuente
Rscript
(ylittler
), en caso de que se lo pregunten.Si está interesado en analizar los argumentos de la línea de comandos en un script R, pruebe 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
fuente
Esto funciona,
pero no sé qué sucede si tiene más de 1 versión de R instalada en su máquina.
Si lo haces asi
le dice al intérprete que use la R que aparezca primero en su camino.
fuente
Si el programa que está utilizando para ejecutar su script necesita parámetros, ¡puede ponerlos al final de #! línea:
Sin saber R, no puedo probar correctamente, pero esto parece funcionar:
fuente
Solo una nota para agregar a esta publicación. Las versiones posteriores de
R
parece haber enterradoRscript
un poco. Para R 3.1.2-1 en OSX descargado en enero de 2015 encontréRscript
enEntonces, en lugar de algo como
#! /sw/bin/Rscript
, necesitaba usar lo siguiente en la parte superior de mi script.El
locate Rscript
podría ser útil para usted.fuente
#!/usr/bin/env Rscript
lugar de una ruta codificada en losR
scripts (y agregar esa ruta larga a su$PATH
)Es posible que desee utilizar el módulo rpy2 de python. Sin embargo, la forma "correcta" de hacer esto es con R CMD BATCH. Puede modificar esto para escribir en STDOUT, pero el valor predeterminado es escribir en un archivo .Rout. Vea el ejemplo a continuación:
Nota: querrá probar --vanilla y otras opciones para eliminar todo el cruft de inicio.
fuente
Pruebe smallR para escribir scripts R rápidos en la línea de comando:
http://code.google.com/p/simple-r/
(
r
comando en el directorio)Trazar desde la línea de comando usando smallR se vería así:
fuente
littler
sin duda sería preferible (ya que todavía está vivo); o bien, sólo tiene que utilizarRscript
(que en realidad salió despuéslittler
se creó.)Lo siguiente me funciona al usar MSYS bash en Windows: no tengo R en mi caja de Linux, así que no puedo probarlo allí. Necesita dos archivos: el primero llamado runr ejecuta R con un parámetro de archivo
Necesitas hacer este ejecutable con chmod + x runr .
Luego, en su archivo de script:
Nota la #! Es posible que la línea runr deba incluir la ruta completa a runr, dependiendo de cómo esté usando el comando, cómo esté configurada su variable PATH, etc.
No es bonito, ¡pero parece funcionar!
fuente