Línea de comando R que pasa un nombre de archivo a la secuencia de comandos en argumentos (Windows)

Me está costando pasar un nombre de archivo a mi secuencia de comandos R. El archivo es un archivo csv con los parámetros de proceso por lotes para varias ejecuciones del script. Estoy tratando de incluirlo aquí para que el usuario no necesite editar el guión R para especificar la ubicación de ese archivo.

La syntax de mi línea de comandos de Windows es:

R CMD BATCH --slave "--args fn=batch.csv" myscript.r output.txt 

Lo más cerca que he estado de recuperar esto en mi guión R es haciendo:

 eval(parse(file=commandArgs()[8]))) batch_args = read.table(fn, sep=",") 

He experimentado con commandArgs(trailingOnly=TRUE) y parse(text=commandArgs()[8]) , etc., sin suerte. La mayoría de la documentación que he visto no se aplica específicamente a pasar nombres de archivos. ¿Alguien puede pensar en una solución?

Como dije en mi comentario, usaría Rscript lugar de R CMD BATCH :

 Rscript myscript.R batch.csv 

donde myscript.R contiene:

 args <- commandArgs(TRUE) batch_args <- read.table(args[1], sep=",") # loop over multiple runs 

Además de usar Rscript (como dijo Josh) también debería usar los paquetes CRAN getopt u optparse ya que fueron escritos para este propósito.

¿Qué quieres decir con “sin suerte”? El nombre de archivo está ahí, en la función commandArgs (), solo tienes que averiguar cómo sacarlo. Código y mensajes de error son útiles.

Eso no es un problema si el único argumento adicional es un nombre de archivo, ya sabes su posición. Lo que te confundirá es cuando comiences a tener un argumento más complejo pasando.

También estás complicando las cosas con pasar ‘fn = foo.csv’. Simplemente pase el nombre del archivo y asígnelo a fn en su script. Si realmente quiere usar eval, probablemente necesite citar su nombre de archivo, así myscript.r es:

 ca = commandArgs(trailingOnly=TRUE) eval(parse(text=ca)) print(read.csv(fn)) 

y corre así:

 R --slave "--args fn='batch.csv'" < myscript.r ABC 1 1 2 3 2 6 8 3 

Donde batch.csv es un archivo csv simple.

Podría hacer un ciclo sobre "ca" en su script y evaluar todo. Sin embargo, es un poco peligroso, ya que podría romper fácilmente la funcionalidad básica.

Personalmente, recorro ca, busco pares nombre = valor para un conjunto conocido de nombres y los establezco. Básicamente implementando getopt, pero alguien probablemente ya lo haya hecho ...

tratar

 fn="batch.csv"; R CMD BATCH --slave "--args $fn" myscript.r output.txt 
    Intereting Posts