Riga di comando R passando un nome file per lo script in argomenti (Windows)

Sto avendo difficoltà a passare un nome di 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.

La mia syntax della riga di comando di Windows è:

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

Il più vicino che ho ottenuto per recuperare 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?

    Come ho detto nel mio commento, 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 

    Oltre a usare Rscript (come diceva Josh) dovresti usare anche i pacchetti CRAN getopt o optparse così come sono stati scritti proprio per questo scopo.

    Cosa intendi con ‘senza fortuna’? 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, sai 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 vuoi davvero usare eval probabilmente devi citare il tuo nome di file, quindi myscript.r è:

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

    e corri così:

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

    Dove batch.csv è un semplice file CSV.

    Potresti fare un loop su "ca" nel tuo script e valutare tutto. È leggermente pericoloso, dal momento che potresti facilmente rompere le funzionalità di base.

    Personalmente mi piacerebbe ricorrere al ca, cercare coppie nome = valore per un gruppo noto di nomi e impostarli. Fondamentalmente implementando getopt, ma qualcuno lo ha già fatto ...

    provare

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