2011-01-26 10 views
9

Ho difficoltà a passare un nome file al mio script R. Il file è un file CSV con i parametri batch per più esecuzioni dello script. Sto cercando di includerlo qui in modo che l'utente non abbia bisogno di modificare lo script R per specificare la posizione di quel file.Riga di comando R passando un nome file per lo script in argomenti (Windows)

sintassi della riga di comando Il mio Windows è:

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

Il più vicino che ho ottenuto per il recupero di questo nel mio script R è facendo:

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

Ho sperimentato con commandArgs(trailingOnly=TRUE) e parse(text=commandArgs()[8]), ecc ., senza fortuna. La maggior parte della documentazione che ho visto non si applica in modo specifico ai nomi dei file in transito. Qualcuno può pensare a una soluzione?

+0

mi consiglia di utilizzare 'Rscript' invece di' R CMD BATCH'. Quale versione di R stai usando? –

+0

Utilizzo di R 2.12.0. Posso usare Rscript usando la stessa sintassi? – Benjamin

+0

No, la sintassi è diversa. Confronta '? Rscript' e'? BATCH'. –

risposta

17

Come ho detto nel mio commento, vorrei utilizzare Rscript invece di R CMD BATCH:

Rscript myscript.R batch.csv 

dove myscript.R contiene:

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

Con questa sintassi esatta, ottengo "Errore: impossibile trovare la funzione" batch_args ".Se inserisco un'istruzione print (args)," batch.csv "è lì, tuttavia. – Benjamin

+0

Non mi interessa usare Rscript, ma posso Ho ottenuto l'output scritto su un file simile a R CMD BATCH --slave? Perché è meglio Rscript? – Benjamin

+0

@Benjamin: Penso che hai copiato e/o incollato qualcosa di sbagliato. In nessun modo il codice che ho postato ti avrebbe dato quell'errore perché questo errore richiede qualcosa come 'batch_args()'. –

6

Cosa intendi per "sfortuna"? Il nome del file è lì, nella funzione commandArgs(), devi solo capire come farlo uscire. Codice e messaggi di errore sono a portata di mano.

Questo non è un problema se l'unico argomento extra è un nome di file, si conosce la sua posizione. Ciò che ti confonderà è quando inizi a passare argomenti più complessi.

Stai complicando anche le cose con il passaggio di 'fn = foo.csv'. Basta passare il nome del file e assegnarlo a fn nel tuo script. Se davvero si vuole utilizzare eval probabilmente è necessario citare il nome del file, quindi myscript.r è:

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

ed eseguire quindi:

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

Dove batch.csv è un file csv semplice.

Si potrebbe eseguire un ciclo su "ca" nello script e valutare tutto. È leggermente pericoloso, dal momento che potresti facilmente rompere le funzionalità di base.

Personalmente eseguirò il loop su ca, cerco coppie nome = valore per un gruppo noto di nomi e li imposto. In pratica attuazione getopt, ma qualcuno ha probabilmente fatto che già ...

+0

Quasi funziona, ma si interrompe quando prova a leggere read.table perché "batch.csv" non è riconosciuto come nome file corretto ma come stringa. Anche se dare il percorso completo potrebbe aiutare, ma poi si rompe a causa degli spazi.Attualmente lo eseguo dalla directory in cui si trovano tutti i file (.r, .txt e .csv). – Benjamin

+0

Non esiste un "nome file appropriato". R memorizza i nomi di file nelle stringhe. fn = "batch.csv"; read.csv (fn) leggerà dal file batch.csv. – Spacedman

+0

ok, il mio esempio ora legge da un file csv come proof-of-concept. – Spacedman

7

Oltre a utilizzare Rscript (come Josh ha detto), è necessario utilizzare anche i pacchetti CRAN getopt o optparse poiché sono stati scritti proprio per questo scopo.

+1

+1 per il puntatore al pacchetto 'optparse'. – reprogrammer

2

provare

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