2012-11-20 12 views
6

Ho uno script (chiamarlo Main.R) che ha il seguente codice per trovare se stesso quando l'eseguo:Come può uno script trovarsi in R in esecuzione dalla riga di comando?

frame_files <- lapply(sys.frames(), function(x) x$ofile) 
frame_files <- Filter(Negate(is.null), frame_files) 
main.dir <- dirname(dirname(frame_files[[length(frame_files)]])) 

Questo è usato per ottenere la directory sopra la propria directory, main.dir, che viene utilizzato per chiamare altri script relativi a questo percorso.

Mi interessa l'esecuzione di questo script da una riga di comando, ad esempio

R CMD BATCH Main.R 

o

Rscript Main.R 

Purtroppo, i comandi di cui sopra non funzionano quando chiamo lo script dal comando linea.

C'è qualche codice che potrei inserire in Main.R o un'opzione di chiamata su R o Rscript che posso usare invece?

In particolare, la soluzione dovrebbe funzionare in Windows.

+0

Questo aiuto? http://stackoverflow.com/questions/750786/whats-the-best-way-to-use-r-scripts-on-the-command-line – atomh33ls

+0

Per essere onesti, non sono sicuro, ma non lo fa t assomiglia Devo dire che non sono bravo a usare la riga di comando. Ho modificato il mio post per aggiungere che sto usando Windows, non so se faccia la differenza nella risposta. Leggendo altri post, ho l'impressione #! non funziona in Windows. – J4y

risposta

8

Qui di seguito è una soluzione che vi darà il corretto percorso di directory del file quando lo script viene eseguito sia con source o con rscript.

# this is wrapped in a tryCatch. The first expression works when source executes, the 
# second expression works when R CMD does it. 
full.fpath <- tryCatch(normalizePath(parent.frame(2)$ofile), # works when using source 
       error=function(e) # works when using R CMD 
        normalizePath(unlist(strsplit(commandArgs()[grep('^--file=', commandArgs())], '='))[2])) 
dirname(full.fpath) 

La chiave di questo è la funzione normalizePath. Dato un nome percorso relativo o abbreviato, normalizePath restituirà un percorso valido o genera un errore. Quando si esegue lo script da Rscript, se si specifica normalizePath il nome file di base dello script corrente, verrà restituito il percorso completo, indipendentemente dalla directory corrente. Rende anche il percorso giusto quando si fornisce un percorso relativo a R CMD e c'è uno script con lo stesso nome nella directory corrente!

Nel codice sopra, estraggo il nome file da una delle stringhe restituite da commandArgs. Se dai un'occhiata all'output di commandArgs, vedrai che il nome del file è il 4 ° argomento. L'argomento è registrato come '--file = yourscript.R', quindi nella riga finale sopra, ho diviso la stringa su '=' e ho estratto il nome del file.

+1

+1 - ma esegui 'Rscript' con opzioni extra, come' --vanilla' e '--file = [...]' potrebbero finire ovunque. Sarebbe più saggio usare una funzione simile a 'grep' per trovarla piuttosto che usare una posizione codificata come' 4'. – flodel

+0

Grazie per attirare l'attenzione su questo. Lasciato fuori per brevità. –

+0

@mplourde Grazie! Non ero a conoscenza di 'normalizePath'.Mi piace il fatto che tu abbia tutto dentro con 'tryCatch'. – J4y

1

On idea è di dare il percorso come un argomento per il tuo Main.R

suppongo che si chiama con rscript.

Rscript Main.R 'path' 

nel vostro Main.R si aggiunge il codice per leggere l'argomento

args <- commandArgs(trailingOnly = TRUE) 
mainpath <- as.character(args[1]) 
Problemi correlati