script por pasar parametros linea from comandos argumentos r rscript

from - pasar parametros por linea de comandos java



Pasar los argumentos de la lĂ­nea de comando a R CMD LOTE (6)

Agrego una respuesta porque creo que una solución de una línea siempre es buena. Encima de su archivo myRscript.R , agregue la siguiente línea:

eval(parse(text=paste(commandArgs(trailingOnly = TRUE), collapse=";")))

Luego envíe su script con algo como:

R CMD BATCH [options] ''--args arguments you want to supply'' myRscript.R &

Por ejemplo:

R CMD BATCH --vanilla ''--args N=1 l=list(a=2, b="test") name="aname"'' myscript.R &

Entonces:

> ls() [1] "N" "l" "name"

He estado usando R CMD BATCH my_script.R desde un terminal para ejecutar un guión R Ahora estoy en el punto en el que me gustaría pasarle una discusión al comando, pero tengo algunos problemas para hacerlo funcionar. Si hago R CMD BATCH my_script.R blabla entonces blabla convierte en el archivo de salida, en lugar de ser interpretado como un argumento disponible para el script R que se está ejecutando.

He intentado con Rscript my_script.R blabla que parece transmitir correctamente blabla como argumento, pero luego no obtengo el archivo de salida my_script.Rout que obtengo con R CMD BATCH (quiero el archivo .Rout ). Si bien podría redirigir la salida de una llamada a Rscript a un nombre de archivo de mi elección, no obtendría los comandos de entrada R incluidos en el archivo como lo hace R CMD BATCH en el archivo .Rout .

Entonces, idealmente, estoy buscando una manera de pasar argumentos a un script R que se ejecuta mediante el método R CMD BATCH , aunque estaría contento con un enfoque que use Rscript si hay una manera de hacer que produzca un archivo .Rout comparable.


Aquí hay otra forma de procesar argumentos de línea de comando, usando R CMD BATCH . Mi enfoque, que se basa en una respuesta anterior aquí , le permite especificar argumentos en la línea de comandos y, en su secuencia de comandos R, dar algunos o todos ellos valores predeterminados.

Aquí hay un archivo R, que llamo test.R :

defaults <- list(a=1, b=c(1,1,1)) ## default values of any arguments we might pass ## parse each command arg, loading it into global environment for (arg in commandArgs(TRUE)) eval(parse(text=arg)) ## if any variable named in defaults doesn''t exist, then create it ## with value from defaults for (nm in names(defaults)) assign(nm, mget(nm, ifnotfound=list(defaults[[nm]]))[[1]]) print(a) print(b)

En la línea de comando, si escribo

R CMD BATCH --no-save --no-restore ''--args a=2 b=c(2,5,6)'' test.R

luego dentro de R tendremos a = 2 b = c(2,5,6) . Pero podría, digamos, omitir b , y agregar otro argumento c :

R CMD BATCH --no-save --no-restore ''--args a=2 c="hello"'' test.R

Entonces en R tendremos a = 2 , b = c(1,1,1) (el valor predeterminado) y c = "hello" .

Finalmente, para mayor comodidad, podemos ajustar el código R en una función, siempre que tengamos cuidado con el medio ambiente:

## defaults should be either NULL or a named list parseCommandArgs <- function(defaults=NULL, envir=globalenv()) { for (arg in commandArgs(TRUE)) eval(parse(text=arg), envir=envir) for (nm in names(defaults)) assign(nm, mget(nm, ifnotfound=list(defaults[[nm]]), envir=envir)[[1]], pos=envir) } ## example usage: parseCommandArgs(list(a=1, b=c(1,1,1)))


Después de probar las opciones descritas aquí, encontré esta publicación de Forester en r-bloggers. Creo que es una opción limpia a considerar.

Puse su código aquí:

Desde línea de comando

$ R CMD BATCH --no-save --no-restore ''--args a=1 b=c(2,5,6)'' test.R test.out &

Test.R

##First read in the arguments listed at the command line args=(commandArgs(TRUE)) ##args is now a list of character vectors ## First check to see if arguments are passed. ## Then cycle through each element of the list and evaluate the expressions. if(length(args)==0){ print("No arguments supplied.") ##supply default values a = 1 b = c(1,1,1) }else{ for(i in 1:length(args)){ eval(parse(text=args[[i]])) } } print(a*2) print(b*3)

En test.out

> print(a*2) [1] 2 > print(b*3) [1] 6 15 18

Gracias a Forester !


En su script R, llamado test.R :

args <- commandArgs(trailingOnly = F) myargument <- args[length(args)] myargument <- sub("-","",myargument) print(myargument) q(save="no")

Desde la línea de comando ejecuta:

R CMD BATCH -4 test.R

Su archivo de salida, test.Rout, mostrará que el argumento 4 se ha pasado con éxito a R:

cat test.Rout > args <- commandArgs(trailingOnly = F) > myargument <- args[length(args)] > myargument <- sub("-","",myargument) > print(myargument) [1] "4" > q(save="no") > proc.time() user system elapsed 0.222 0.022 0.236


Mi impresión es que R CMD BATCH es un poco una reliquia. En cualquier caso, el ejecutable de Rscript más reciente (disponible en todas las plataformas), junto con commandArgs() hace que el procesamiento de los argumentos de línea de comando sea bastante fácil.

Como ejemplo, aquí hay un pequeño script, llámalo "myScript.R" :

## myScript.R args <- commandArgs(trailingOnly = TRUE) rnorm(n=as.numeric(args[1]), mean=as.numeric(args[2]))

Y aquí está lo que parece invocarlo desde la línea de comando

> Rscript myScript.R 5 100 [1] 98.46435 100.04626 99.44937 98.52910 100.78853

Editar:

No es que lo recomiende, pero ... usando una combinación de source() y sink() , podría hacer que Rscript produzca un archivo .Rout como el producido por R CMD BATCH . Una forma sería crear un pequeño guión R, llámalo RscriptEcho.R , al que llamas directamente con Rscript. Puede verse así:

## RscriptEcho.R args <- commandArgs(TRUE) srcFile <- args[1] outFile <- paste0(make.names(date()), ".Rout") args <- args[-1] sink(outFile, split = TRUE) source(srcFile, echo = TRUE)

Para ejecutar tu script real, entonces harías:

Rscript RscriptEcho.R myScript.R 5 100 [1] 98.46435 100.04626 99.44937 98.52910 100.78853

que ejecutará myScript.R con los argumentos suministrados y hundirá entrada, salida y mensajes intercalados en un .Rout nombre .Rout .

Edit2:
Puede ejecutar Rscript en detalle y colocar la salida detallada en un archivo.

Rscript --verbose myScript.R 5 100 > myScript.Rout


Necesita poner argumentos antes de my_script.R y usar - en los argumentos, por ej.

R CMD BATCH -blabla my_script.R

commandArgs() recibirá -blabla como una cadena de caracteres en este caso. Ver la ayuda para más detalles:

$ R CMD BATCH --help Usage: R CMD BATCH [options] infile [outfile] Run R non-interactively with input from infile and place output (stdout and stderr) to another file. If not given, the name of the output file is the one of the input file, with a possible ''.R'' extension stripped, and ''.Rout'' appended. Options: -h, --help print short help message and exit -v, --version print version info and exit --no-timing do not report the timings -- end processing of options Further arguments starting with a ''-'' are considered as options as long as ''--'' was not encountered, and are passed on to the R process, which by default is started with ''--restore --save --no-readline''. See also help(''BATCH'') inside R.