2015-06-07 9 views
7

Używam implementacji docopt dla R. Mój skrypt ma opcję wiersza polecenia, gdzie krótki formularz jest -g. Kiedy uruchamiam mój skrypt, wydaje się, że ten argument jest najpierw interpretowany przez R, a następnie przez mój skrypt. Dlatego otrzymuję uderzenie nadgarstka o nieprzeznaczanie wartości dla GUI. Czy mogę zapobiec R od próby pracy z tymi argumentami wiersza poleceń?Jak zapobiec interpretowaniu argumentów linii poleceń przez R, a tylko przez mój skrypt?

Przykład skryptu:

#!/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)) 

Oto co się dzieje, gdy uruchomię go:

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

Jeżeli zmienisz krótki formularz opcji z -g do -j The WARNING odchodzi ... ale mam dobry powód do używania listu g!

+1

Jeśli trzymać się tylko przy użyciu '' --goodies bez krótkiej formie zjedzony przez R, obejdziesz go. –

+0

'-G' powinno działać też ... – krlmlr

Odpowiedz

3

Jak wskazano przez @krlmlr, ten problem ma związek z Rscript (w haszowaniu). Jednym obejściem byłoby użycie funkcjonalności dostarczonej przez znakomitą littler zamiast Rscript.Na przykład za pomocą #!/usr/bin/Rscript w foo.R, pojawia się problem:

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

goodies = donuts 

zastąpienie tego z #!/usr/local/bin/r w nowym skrypcie foo2.R, mam czyste wyjście:

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

wygląda na to, że jesteś na maszynę OS X, więc jeśli zdecydujesz się zainstalować littler, pamiętaj, aby zwrócić uwagę na ostrzeżenie autorów:

Na OS X, możesz go zbudować v ia skonfigurować --program-prefix = "l" do przemianowany to LR jako że zwłaszcza OS myśli R i R są takie same

+2

Mogę zająć się sugestią dla mniejszego, ale może jestem stronniczy :) –

+0

Chciałbym użyć miotu, ale potrzebowałbym go do uruchomienia na MS Windows (GIT Bash w rzeczywistości): wszelkie szanse/plany na to? – espinielli

3

Komendy R i Rscript znają. Porównaj wyjście z następujących powodów:

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

To działa z powodu early exit jeśli --args zostanie wykryty. Jednak ostrzeżenie --gui jest wyzwalane w osobnej pętli before this.

Oznacza to, że

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

będzie działać, ale daje fałszywe ostrzeżenie, a

Rscript -e "commandArgs()" --gui 

daje błąd od razu. Wygląda na to, że dotyczy to tylko --gui i -g.

Jako szybki i brzydka siekać, można wstawić coś podobnego

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

na beginning of the GUI-check loop. Dopóki to się nie zmieni w R, podejrzewam, że nie ma innego wyjścia, jak tylko uniknąć przełącznika -g lub żyć z (w przeciwnym razie nieszkodliwym) ostrzeżeniem.

+0

Wow. Piszemy mnóstwo skryptów z docopt w pracy, ale jeszcze nie wpadliśmy na ten problem z '-g'. To jest dość ... braindead. –

+0

Napisałem dokładnie jeden skrypt z docopt, ale udało mi się natknąć na magiczny przypadek '-g'. Mam szczęście. – jennybryan

+0

Naprawdę nie znam protokołu dotyczącego oznaczania "właściwej" odpowiedzi. Technicznie jest to właściwa odpowiedź, która jest taka, że ​​jest to niemożliwe (?). Ale odpowiedź "użyj littlera" faktycznie sprawia, że ​​znowu się poruszasz ... – jennybryan

Powiązane problemy