Tengo un script R para el que me gustaría poder proporcionar varios parámetros de línea de comandos (en lugar de valores de parámetros de código rígido en el propio código). El script se ejecuta en Windows.
No puedo encontrar información sobre cómo leer los parámetros suministrados en la línea de comandos en mi script R. Me sorprendería si no se puede hacer, así que tal vez simplemente no estoy usando las mejores palabras clave en mi búsqueda de Google ...
¿Alguna sugerencia o recomendación?
command-line
r
parameters
monch1962
fuente
fuente
Respuestas:
La respuesta de Dirk aquí es todo lo que necesitas. Aquí hay un ejemplo mínimo reproducible.
Hice dos archivos:
exmpl.bat
yexmpl.R
.exmpl.bat
:Alternativamente, usando
Rterm.exe
:exmpl.R
:Guarde ambos archivos en el mismo directorio y comience
exmpl.bat
. En el resultado obtendrás:example.png
con alguna tramaexmpl.batch
con todo lo que se hizoTambién puede agregar una variable de entorno
%R_Script%
:y úsalo en tus scripts por lotes como
%R_Script% <filename.r> <arguments>
Diferencias entre
RScript
yRterm
:Rscript
tiene una sintaxis más simpleRscript
elige automáticamente la arquitectura en x64 (consulte R Instalación y administración, 2.6 Subarquitecturas para más detalles)Rscript
necesitaoptions(echo=TRUE)
en el archivo .R si desea escribir los comandos en el archivo de salidafuente
Algunos puntos:
Se puede acceder a los parámetros de la línea de comandos a través de
commandArgs()
, así que veahelp(commandArgs)
para una descripción general.Puede usarlo
Rscript.exe
en todas las plataformas, incluido Windows. Lo apoyarácommandArgs()
. littler podría ser portado a Windows, pero ahora solo vive en OS X y Linux.Hay dos paquetes de complementos en CRAN - getopt y optparse - que fueron escritos para el análisis de la línea de comandos.
Editar en noviembre de 2015: han aparecido nuevas alternativas y recomiendo docopt de todo corazón .
fuente
Agregue esto a la parte superior de su script:
Luego puede referirse a los argumentos pasados como
args[1]
,args[2]
etc.Entonces corre
Si sus argumentos son cadenas con espacios en ellos, encierre entre comillas dobles.
fuente
Prueba library (getopt) ... si quieres que las cosas sean más agradables. Por ejemplo:
fuente
necesitas littler (pronunciado 'little r')
Dirk llegará en unos 15 minutos para elaborar;)
fuente
Como
optparse
se ha mencionado un par de veces en las respuestas y proporciona un kit completo para el procesamiento de la línea de comandos, aquí hay un breve ejemplo simplificado de cómo puede usarlo, suponiendo que exista el archivo de entrada:script.R:
Dado un archivo arbitrario
blah.txt
con 23 líneas.En la línea de comando:
Rscript script.R -h
salidasRscript script.R -n blah.txt
salidas[1] "69"
Rscript script.R -n -f 5 blah.txt
salidas[1] "115"
fuente
En bash, puede construir una línea de comando como la siguiente:
Puede ver que la variable
$z
se sustituye por bash shell con "10" y este valor es recogidocommandArgs
y alimentadoargs[2]
, y el comando de rangox=1:10
ejecutado con éxito por R, etc.fuente
FYI: hay una función args (), que recupera los argumentos de las funciones R, que no debe confundirse con un vector de argumentos llamado args
fuente
Si necesita especificar opciones con banderas, (como -h, --help, --number = 42, etc.) puede usar el paquete R optparse (inspirado en Python): http://cran.r-project.org /web/packages/optparse/vignettes/optparse.pdf .
Al menos así es como entiendo su pregunta, porque encontré esta publicación cuando buscaba un equivalente de bash getopt, o perl Getopt, o python argparse y optparse.
fuente
Acabo de armar una buena estructura de datos y una cadena de procesamiento para generar este comportamiento de conmutación, no se necesitan bibliotecas. Estoy seguro de que se habrá implementado varias veces, y encontré este hilo en busca de ejemplos, pensé que lo incluiría.
Ni siquiera necesitaba indicadores en particular (el único indicador aquí es un modo de depuración, creando una variable que verifico como condición para iniciar una función descendente
if (!exists(debug.mode)) {...} else {print(variables)})
. Laslapply
siguientes declaraciones de comprobación de indicador producen lo mismo que:donde
args
está la variable leída de los argumentos de la línea de comandos (un vector de caracteres, equivalente ac('--debug','--help')
cuando los proporciona, por ejemplo)?Es reutilizable para cualquier otro indicador y evita toda la repetición, y no hay bibliotecas, por lo que no hay dependencias:
Tenga en cuenta que
flag.details
aquí los comandos se almacenan como cadenas, luego se evalúan coneval(parse(text = '...'))
. Optparse es obviamente deseable para cualquier script serio, pero el código de funcionalidad mínima también es bueno a veces.Salida de muestra:
fuente