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.batyexmpl.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.pngcon alguna tramaexmpl.batchcon 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
RScriptyRterm:Rscripttiene una sintaxis más simpleRscriptelige automáticamente la arquitectura en x64 (consulte R Instalación y administración, 2.6 Subarquitecturas para más detalles)Rscriptnecesitaoptions(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.exeen 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
optparsese 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.txtcon 23 líneas.En la línea de comando:
Rscript script.R -hsalidasRscript script.R -n blah.txtsalidas[1] "69"Rscript script.R -n -f 5 blah.txtsalidas[1] "115"fuente
En bash, puede construir una línea de comando como la siguiente:
Puede ver que la variable
$zse sustituye por bash shell con "10" y este valor es recogidocommandArgsy alimentadoargs[2], y el comando de rangox=1:10ejecutado 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)}). Laslapplysiguientes declaraciones de comprobación de indicador producen lo mismo que:donde
argsestá 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.detailsaquí 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