Mam skrypt R, dla którego chciałbym móc podać kilka parametrów wiersza polecenia (zamiast wartości parametrów kodu twardego w samym kodzie). Skrypt działa w systemie Windows.
Nie mogę znaleźć informacji o tym, jak odczytać parametry podane w wierszu polecenia w moim skrypcie R. Byłbym zaskoczony, gdyby nie można tego zrobić, więc może po prostu nie używam najlepszych słów kluczowych w mojej wyszukiwarce Google ...
Wszelkie wskazówki lub rekomendacje?
command-line
r
parameters
monch1962
źródło
źródło
Odpowiedzi:
Odpowiedź Dirka tutaj jest wszystkim, czego potrzebujesz. Oto minimalny, powtarzalny przykład.
Zrobiłem dwa pliki:
exmpl.bat
iexmpl.R
.exmpl.bat
:Alternatywnie, używając
Rterm.exe
:exmpl.R
:Zapisz oba pliki w tym samym katalogu i uruchom
exmpl.bat
. W rezultacie otrzymasz:example.png
z jakąś fabułąexmpl.batch
z tym wszystkim, co zostało zrobioneMożesz także dodać zmienną środowiskową
%R_Script%
:i użyj go w skryptach wsadowych jako
%R_Script% <filename.r> <arguments>
Różnice między
RScript
iRterm
:Rscript
ma prostszą składnięRscript
automatycznie wybiera architekturę na x64 (szczegóły w R Instalacja i administracja, 2.6 Sub-architektury )Rscript
potrzebujeoptions(echo=TRUE)
w pliku .R, jeśli chcesz zapisać polecenia w pliku wyjściowymźródło
Kilka punktów:
Parametry wiersza polecenia są dostępne przez
commandArgs()
, więc zobaczhelp(commandArgs)
przegląd.Możesz używać
Rscript.exe
na wszystkich platformach, w tym Windows. Będzie wspieraćcommandArgs()
. littler może być przeniesiony do systemu Windows, ale teraz działa tylko w systemie OS X i Linux.Istnieją dwa dodatkowe pakiety w CRAN - getopt i optparse - które zostały napisane do analizowania z wiersza poleceń.
Edytuj w listopadzie 2015: Pojawiły się nowe alternatywy i szczerze polecam docopt .
źródło
Dodaj to na początku skryptu:
Następnie można odnieść się do argumentów przekazanych jako
args[1]
,args[2]
etc.Następnie uruchomić
Jeśli argumentami są ciągi znaków ze spacjami, należy je ująć w podwójny cudzysłów.
źródło
Spróbuj biblioteki (getopt) ... jeśli chcesz, żeby było lepiej. Na przykład:
źródło
potrzebujesz littler (wymawiane „little r”)
Dirk przyjedzie za około 15 minut na opracowanie;)
źródło
Ponieważ
optparse
kilka razy wspomniano w odpowiedziach i stanowi on kompletny zestaw do przetwarzania w wierszu poleceń, oto krótki uproszczony przykład tego, jak można go używać, zakładając, że plik wejściowy istnieje:skrypt.R:
Biorąc pod uwagę dowolny plik
blah.txt
z 23 liniami.W wierszu poleceń:
Rscript script.R -h
wyjściaRscript script.R -n blah.txt
wyjścia[1] "69"
Rscript script.R -n -f 5 blah.txt
wyjścia[1] "115"
źródło
W bash możesz zbudować wiersz poleceń taki jak poniżej:
Widać, że zmienna
$z
jest zastąpiona powłoką bash przez „10”, a ta wartość jest pobieranacommandArgs
i wprowadzanaargs[2]
, a komenda zasięgux=1:10
wykonywana przez R pomyślnie itp. Itd.źródło
FYI: istnieje funkcja args (), która pobiera argumenty funkcji R, których nie należy mylić z wektorem argumentów o nazwie args
źródło
Jeśli musisz podać opcje z flagami (np. -H, --help, --number = 42 itd.), Możesz użyć pakietu optparse pakietu R (inspirowanego Pythonem): http://cran.r-project.org /web/packages/optparse/vignettes/optparse.pdf .
Przynajmniej tak rozumiem twoje pytanie, ponieważ znalazłem ten post, gdy szukam odpowiednika bash getopt, perl Getopt lub python argparse i optparse.
źródło
Właśnie połączyłem ładną strukturę danych i łańcuch przetwarzania, aby wygenerować to zachowanie przełączania, bez bibliotek. Jestem pewien, że będzie zaimplementowany wiele razy i natknąłem się na ten wątek, szukając przykładów - pomyślałem, że się w to włożę.
Nie potrzebowałem nawet szczególnie flag (jedyną flagą tutaj jest tryb debugowania, tworzenie zmiennej, którą sprawdzam jako warunek uruchomienia funkcji podrzędnej
if (!exists(debug.mode)) {...} else {print(variables)})
. Poniższelapply
instrukcje sprawdzające flagę dają to samo, co:gdzie
args
zmienna jest wczytywana z argumentów wiersza poleceń (wektor znakowy, równoważny zc('--debug','--help')
wtedy, gdy je podajesz)Jest wielokrotnego użytku dla każdej innej flagi i unikasz wszystkich powtórzeń, bez bibliotek, więc żadnych zależności:
Zauważ, że
flag.details
tutaj polecenia są przechowywane jako ciągi znaków, a następnie analizowane za pomocąeval(parse(text = '...'))
. Optparse jest oczywiście pożądane dla każdego poważnego skryptu, ale kod minimalnej funkcjonalności jest czasem zbyt dobry.Przykładowe dane wyjściowe:
źródło