2011-01-26 8 views
9

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.R línea de comando que pasa un nombre de archivo a la secuencia de comandos en argumentos (Windows)

sintaxis de línea de comandos Mi Windows es:

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

Lo más cerca que he llegado a 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?

+0

recomendaría el uso de 'Rscript' en lugar de' R CMD BATCH'. ¿Qué versión de R estás usando? –

+0

Usando R 2.12.0. Puedo usar Rscript usando la misma sintaxis? – Benjamin

+0

No, la sintaxis es diferente. Compare '? Rscript' y'? BATCH'. –

Respuesta

17

Como dije en mi comentario, me gustaría utilizar en lugar de RscriptR 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 
+0

Con esta sintaxis exacta, obtengo "Error: no he podido encontrar la función" batch_args ". Si pongo una instrucción print (args)," batch.csv "está ahí, sin embargo. – Benjamin

+0

No me importa usar Rscript, pero puedo Me sale el resultado escrito en un archivo similar a R CMD BATCH --slave? ¿Por qué es mejor Rscript? – Benjamin

+0

@Benjamin: Creo que copió y/o pegó algo incorrecto. No hay forma de que el código que publiqué le daría ese error porque ese error requiere algo como 'batch_args()'. –

6

¿Qué quiere decir con 'no luck'? 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 conoce su posición. Lo que te confundirá es cuando comiences a tener un argumento más complejo pasando.

También está complicando las cosas con pasar 'fn = foo.csv'. Simplemente pase el nombre del archivo y asígnelo a fn en su script. Si realmente desea utilizar eval es probable que tenga que citar el nombre del archivo, por lo tanto es myscript.r:

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

y ejecutar así:

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

Dónde batch.csv es un archivo csv sencilla.

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

Personalmente hago un bucle sobre ca, busco pares de nombre = valor para un conjunto conocido de nombres y los configuro. Básicamente la aplicación de getopt, pero probablemente alguien ha hecho ya ...

+0

Casi funciona, pero se rompe cuando intenta hacer read.table porque "batch.csv" no se reconoce como un nombre de archivo correcto sino como una cadena. Pensé que darle la ruta completa podría ayudar, pero luego se rompe debido a los espacios.Actualmente, lo ejecuto desde el directorio donde se encuentran todos los archivos (.r, .txt y .csv). – Benjamin

+0

No existe el "nombre de archivo correcto". R almacena nombres de archivos en cadenas. fn = "batch.csv"; read.csv (fn) leerá desde el archivo batch.csv. – Spacedman

+0

bien, mi ejemplo ahora se lee de un archivo csv como prueba de concepto. – Spacedman

7

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

+1

+1 para el puntero al paquete 'optparse'. – reprogrammer

2

tratar

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