Ich habe ein R-Skript, für das ich mehrere Befehlszeilenparameter bereitstellen möchte (anstelle von Hardcode-Parameterwerten im Code selbst). Das Skript läuft unter Windows.
Ich kann keine Informationen zum Lesen der in der Befehlszeile angegebenen Parameter in mein R-Skript finden. Ich wäre überrascht, wenn dies nicht möglich wäre. Vielleicht verwende ich einfach nicht die besten Keywords in meiner Google-Suche ...
Irgendwelche Hinweise oder Empfehlungen?
command-line
r
parameters
monch1962
quelle
quelle
Antworten:
Dirks Antwort hier ist alles, was Sie brauchen. Hier ist ein minimal reproduzierbares Beispiel.
Ich habe zwei Dateien erstellt:
exmpl.bat
undexmpl.R
.exmpl.bat
::Alternativ mit
Rterm.exe
:exmpl.R
::Speichern Sie beide Dateien im selben Verzeichnis und starten Sie
exmpl.bat
. Im Ergebnis erhalten Sie:example.png
mit etwas Handlungexmpl.batch
mit allem was getan wurdeSie können auch eine Umgebungsvariable hinzufügen
%R_Script%
:und verwenden Sie es in Ihren Batch-Skripten als
%R_Script% <filename.r> <arguments>
Unterschiede zwischen
RScript
undRterm
:Rscript
hat einfachere SyntaxRscript
wählt automatisch die Architektur unter x64 aus ( Einzelheiten finden Sie unter R Installation und Administration, 2.6 Unterarchitekturen ).Rscript
benötigtoptions(echo=TRUE)
in der .R-Datei, wenn Sie die Befehle in die Ausgabedatei schreiben möchtenquelle
Ein paar Punkte:
Auf Befehlszeilenparameter kann über
commandArgs()
zugegriffen werdenhelp(commandArgs)
Sie einen Überblick.Sie können
Rscript.exe
auf allen Plattformen, einschließlich Windows, verwenden. Es wird unterstützencommandArgs()
. kleiner konnte auf Windows portiert werden, lebt aber nur unter OS X und Linux.Es gibt zwei Add-On-Pakete in CRAN - getopt und optparse - die beide für die Befehlszeilenanalyse geschrieben wurden.
Bearbeiten im November 2015: Neue Alternativen sind erschienen und ich empfehle docopt von ganzem Herzen .
quelle
Fügen Sie dies oben in Ihr Skript ein:
Dann können Sie auf die Argumente verweisen, die als übergeben wurden
args[1]
,args[2]
usw.Dann renne
Wenn Ihre Argumente Zeichenfolgen mit Leerzeichen sind, schließen Sie sie in doppelte Anführungszeichen ein.
quelle
Probieren Sie die Bibliothek (getopt) aus ... wenn Sie möchten, dass die Dinge schöner werden. Beispielsweise:
quelle
du brauchst weniger (ausgesprochen 'kleines r')
Dirk wird in ca. 15 Minuten fertig sein;)
quelle
Da dies
optparse
in den Antworten einige Male erwähnt wurde und ein umfassendes Kit für die Befehlszeilenverarbeitung enthält, finden Sie hier ein kurzes, vereinfachtes Beispiel für die Verwendung, sofern die Eingabedatei vorhanden ist:script.R:
Gegeben eine beliebige Datei
blah.txt
mit 23 Zeilen.In der Befehlszeile:
Rscript script.R -h
AusgängeRscript script.R -n blah.txt
Ausgänge[1] "69"
Rscript script.R -n -f 5 blah.txt
Ausgänge[1] "115"
quelle
In bash können Sie eine Befehlszeile wie folgt erstellen:
Sie können sehen, dass die Variable
$z
durch die Bash-Shell durch "10" ersetzt wird und dieser Wert von aufgenommencommandArgs
und eingegebenargs[2]
wird und der Bereichsbefehlx=1:10
von R erfolgreich ausgeführt wird usw. usw.quelle
Zu Ihrer Information: Es gibt eine Funktion args (), die die Argumente von R-Funktionen abruft, nicht zu verwechseln mit einem Vektor von Argumenten namens args
quelle
Wenn Sie Optionen mit Flags angeben müssen (wie -h, --help, --number = 42 usw.), können Sie das R-Paket optparse (inspiriert von Python) verwenden: http://cran.r-project.org /web/packages/optparse/vignettes/optparse.pdf .
Zumindest verstehe ich Ihre Frage so, weil ich diesen Beitrag gefunden habe, als ich nach einem Äquivalent von bash getopt oder perl Getopt oder python argparse und optparse gesucht habe.
quelle
Ich habe gerade eine schöne Datenstruktur und Verarbeitungskette zusammengestellt, um dieses Schaltverhalten zu erzeugen. Es werden keine Bibliotheken benötigt. Ich bin mir sicher, dass es mehrfach implementiert wurde, und bin auf diesen Thread gestoßen, der nach Beispielen gesucht hat - dachte, ich würde mitmachen.
Ich brauchte nicht einmal besonders Flags (das einzige Flag hier ist ein Debug-Modus, der eine Variable erstellt, auf die ich als Bedingung für das Starten einer Downstream-Funktion prüfe
if (!exists(debug.mode)) {...} else {print(variables)})
. Die folgendenlapply
Anweisungen zur Flag-Prüfung ergeben Folgendes:wo
args
wird die Variable aus Befehlszeilenargumenten eingelesen (ein Zeichenvektor, der äquivalent zu istc('--debug','--help')
wenn Sie diese beispielsweise angeben)?Es ist für jedes andere Flag wiederverwendbar und Sie vermeiden alle Wiederholungen und keine Bibliotheken, also keine Abhängigkeiten:
Beachten Sie, dass
flag.details
hier die Befehle als Zeichenfolgen gespeichert und dann mit ausgewertet werdeneval(parse(text = '...'))
. Optparse ist natürlich für jedes ernsthafte Skript wünschenswert, aber Code mit minimaler Funktionalität ist manchmal auch gut.Beispielausgabe:
quelle