2015-06-07 5 views
7

Sto utilizzando l'implementazione docopt per R. Il mio script ha un'opzione della riga di comando in cui il formato breve è -g. Quando eseguo il mio script, sembra che questo argomento sia prima interpretato da R e poi dal mio script. Di conseguenza ottengo uno schiaffo sul polso che non specifica un valore per la GUI. Posso impedire a R di provare a lavorare con questi argomenti da riga di comando?Come impedire che gli argomenti della riga di comando vengano interpretati da R contro solo dal mio script?

esempio di uno script:

#!/usr/bin/Rscript 

suppressPackageStartupMessages(library(docopt)) 

"docopt practice script 

Usage: foo.R [-g <goodies>] 

Options: 
    -g <goodies>, --goodies=<goodies> Goodies 
" -> doc 

opts <- docopt(doc) 
cat(sprintf("goodies = %s\n", opts$goodies)) 

Ecco cosa succede quando l'eseguo:

Jennifers-MacBook-Pro-3:scripts jenny$ ./foo.R -g donuts 
WARNING: --gui or -g without value ignored 
goodies = donuts 

Se si modifica la forma breve del opzione dal -g al -j, il WARNING va via ... ma ho una buona ragione per usare la lettera g!

+1

Se rispettate solo con '' --goodies senza la forma abbreviata mangiato da R ti giri intorno. –

+0

'-G' dovrebbe funzionare anche ... – krlmlr

risposta

3

Come indicato da @krlmlr, questo problema ha a che fare con Rscript (nel proprio hash bang). Una soluzione alternativa sarebbe utilizzare la funzionalità fornita dall'eccellente littler al posto di Rscript.Ad esempio, utilizzando #!/usr/bin/Rscript in foo.R, ottengo il problema:

[[email protected] R]$ ./foo.R -g donuts 
WARNING: unknown gui 'donuts', using X11 

goodies = donuts 

Sostituire questo con #!/usr/local/bin/r in un nuovo script foo2.R, ottengo una produzione pulita:

[[email protected] R]$ ./foo2.R -g donuts 
goodies = donuts 

Sembra che siete su una macchina OS X, quindi se scegli di installare littler, assicurati di notare l'avviso dell'autore:

Su OS X, potresti volerlo costruire v ia configurare --program-prefix = "l" per rinominò alla LR come quel particolare sistema operativo pensa R e R sono gli stessi

+2

Potrei secondo il suggerimento per il più piccolo ma forse sono di parte :) –

+0

Mi piacerebbe usare i rifiuti, ma avrei bisogno che funzionasse su MS Windows (GIT Bash come un dato di fatto): eventuali possibilità/piani per questo? – espinielli

3

I comandi R e Rscript conoscono --args. Confrontare l'uscita dei seguenti:

R -e "TRUE" --args --silent 
R -e "TRUE" --silent 

Questo funziona a causa di un early exit se --args viene rilevato. Tuttavia, l'avviso --gui viene attivato in un ciclo separato before this.

Questo significa che

Rscript -e "commandArgs()" --args --gui 

funzionerà, ma dare l'allarme spurio, e

Rscript -e "commandArgs()" --gui 

dà un errore subito. Sembra che siano interessati solo --gui e -g.

Come un hack rapido e-sporca, si potrebbe inserire qualcosa di simile

if(!strcmp(*avv, "--args")) { 
    break; 
} 

al beginning of the GUI-check loop. Finché questo non viene modificato in R, sospetto che non ci sia altra scelta che evitare lo switch -g o vivere con l'avviso (altrimenti innocuo).

+0

Wow. Scriviamo un sacco di script con docopt al lavoro ma non abbiamo ancora incontrato questo problema con '-g'. È carino ... Braindead. –

+0

Ho scritto esattamente uno script con docopt ma sono riuscito a imbattersi nel caso magico '-g'. Fortunato me. – jennybryan

+0

Non conosco il protocollo che contrassegna la risposta "giusta". Tecnicamente, questa è la risposta giusta, che è impossibile (?). Ma la risposta 'use littler' ti fa davvero andare avanti di nuovo ... – jennybryan