Es ist sehr praktisch, R-Skripte für einfache Diagramme über die Befehlszeile zu haben. Das Ausführen von R über Bash-Skripte ist jedoch überhaupt nicht bequem. Das Ideal könnte so etwas sein
#!/path/to/R
...
oder
#!/usr/bin/env R
...
aber ich war nicht in der Lage, eine dieser Arbeiten zu machen.
Eine andere Möglichkeit besteht darin, die Skripte z. B. in R zu script.R
belassen und sie mit R --file=script.R
oder ähnlichem aufzurufen . Gelegentlich stützt sich ein Skript jedoch auf undurchsichtige Befehlszeilenoptionen, an denen ein Teil des Codes außerhalb des Skripts vorhanden ist. Beispiel: Wenn Sie Dinge von Bash über ein lokales .R-Profil in R schleichen, sind die gewünschten Schalter dann alles --vanilla
außer --no-init-file
.
Eine andere Option ist ein Bash-Skript, um die R-Flags zu speichern und schmerzlos ausführbar zu sein, das dann das R-Skript aufruft. Das Problem ist, dass dies bedeutet, dass ein einzelnes Programm gerade in zwei Dateien aufgeteilt wurde, die jetzt synchron gehalten, zusammen auf neue Computer übertragen werden müssen usw.
Die Option, die ich derzeit am wenigsten verachte, ist das Einbetten des R in ein Bash-Skript:
#!/bin/bash
... # usage message to catch bad input without invoking R
... # any bash pre-processing of input
... # etc
R --random-flags <<RSCRIPT
# R code goes here
RSCRIPT
Alles ist in einer einzigen Datei. Es ist ausführbar und kann problemlos mit Argumenten umgehen. Das Problem ist, dass das Kombinieren von Bash und R auf diese Weise die Möglichkeit, dass eine IDE auf der einen oder anderen Seite nicht ausfällt, so gut wie ausschließt und mein Herz sehr weh tut.
Gibt es einen besseren Weg, den ich vermisse?
Rscript --help
über die Befehlszeile ausgeführt werden, werden viele nützliche Optionen aufgelistet, die dem Shebang hinzugefügt werden können, z--vanilla
.commandArgs
Funktion und die Paketegetopt
undoptparse
zum Parsen der Befehlszeile. Damit können Argumente und Optionen auch über die Befehlszeile an Ihre Skripte übergeben werden.#!/usr/bin/Rscript
(was nicht die Standardpraxis für R-Skripte ist).Versuchen Sie es kleiner .
littler
Bietet Hash-Bang-Funktionen (dh ein Skript, das mit #! / some / path beginnt) für GNU R sowie eine einfache Befehlszeilen- und Piping-Verwendung.quelle
Die Antwort von Miguel Sanchez ist so, wie sie sein sollte. Die andere Möglichkeit, Rscript auszuführen, könnte der Befehl 'env' sein, um das systemweite RScript auszuführen.
quelle
env
würde es Ihnen ermöglichen, den erstenRscript
gefundenen in Ihrem eigenen auszuführen$PATH
, sodass Sie tatsächlich etwas anderes als einen systemweiten / Standard ausführenRscript
können (der möglicherweise nicht installiert ist/usr/whatever
). Ich würde empfehlen,env
forR
und so zu verwendenRscript
, da diese möglicherweise nicht an Standardorten installiert werden. (Gewöhnlichebash
Skripte können jedoch normalerweise immer sicher verwendet werden#!/bin/bash
.)/bin/sh
. Alles andere mussenv
Lookup verwenden. Insbesondere ist Bash in Computerclustern häufig veraltet und Benutzer haben ihre eigenen benutzerdefinierten Installationen (üblicherweise in~/.local/bin
einem/software
NFS-Mount oder in einem solchen gemeinsam genutzt). Ebenso auf macOS,/bin/bash
wird immer aus Lizenzgründen veraltet, und ein auf dem Laufenden Bash wird häufiger gelegen an/usr/local/bin/bash
(Ich weiß , Ihr Kommentar ist 3 Jahre alt , aber das ist ziemlich wichtig.)/bin/sh
unter keinen Umständen auch "gefährlich" ist, müssen Sie zugeben, dass dies auch der Fall ist/bin/bash
. Die Verwendungenv
ist aufgrund zuverlässiger / inkonsistenterPATH
Einstellungen für verschiedene Benutzer unvorhersehbarer, aber jeder R-Benutzer möchte dieses Verhalten möglicherweise tatsächlich, währendbash
Skripte dies nicht tun. Wenn CI / Cloud neuere Bash-Skripte aufruft, rufen Sie sie einfach mit auf/path/to/my/bash myscript
oder legen Sie den Pfad explizit fest und rufen Sie sie mit aufenv script
. EOT#!/path/to/R
funktioniert nicht, weil R selbst ein Skript ist, alsoexecve
unglücklich ist.ich benutze
R --slave -f script
quelle
Rscript
(undlittler
), falls Sie sich fragen.Wenn Sie Befehlszeilenargumente in ein R-Skript analysieren möchten, versuchen Sie es mit RScript, das ab Version 2.5.x mit R gebündelt ist
http://stat.ethz.ch/R-manual/R-patched/library/utils/html/Rscript.html
quelle
Das funktioniert,
Ich weiß jedoch nicht, was passiert, wenn auf Ihrem Computer mehr als eine Version von R installiert ist.
Wenn du es so machst
Es weist den Interpreter an, nur das zu verwenden, was zuerst auf Ihrem Pfad angezeigt wird.
quelle
Wenn das Programm, mit dem Sie Ihr Skript ausführen, Parameter benötigt, können Sie diese am Ende des # einfügen! Linie:
Da ich R nicht kenne, kann ich nicht richtig testen, aber das scheint zu funktionieren:
quelle
Nur eine Anmerkung zu diesem Beitrag. Spätere Versionen von
R
scheinenRscript
etwas begraben zu haben . Für R 3.1.2-1 unter OSX heruntergeladen Jan 2015 fand ichRscript
inAnstelle von so etwas
#! /sw/bin/Rscript
musste ich also oben in meinem Skript Folgendes verwenden.Das
locate Rscript
könnte für Sie hilfreich sein.quelle
#!/usr/bin/env Rscript
anstelle eines fest codierten Pfads inR
Skripten zu verwenden (und diesen langen Pfad zu Ihrem hinzuzufügen$PATH
)Möglicherweise möchten Sie das rpy2-Modul von Python verwenden. Der "richtige" Weg, dies zu tun, ist jedoch mit R CMD BATCH. Sie können dies ändern, um in STDOUT zu schreiben. Standardmäßig wird jedoch in eine .Rout-Datei geschrieben. Siehe Beispiel unten:
Hinweis: Sie sollten --vanilla und andere Optionen ausprobieren, um alle Start-Cruft zu entfernen.
quelle
Versuchen Sie smallR, um schnelle R-Skripte in die Befehlszeile zu schreiben:
http://code.google.com/p/simple-r/
(
r
Befehl im Verzeichnis)Das Plotten über die Befehlszeile mit smallR würde folgendermaßen aussehen:
quelle
littler
wäre es sicherlich vorzuziehen (da es noch lebt); oder verwenden Sie einfachRscript
(was tatsächlich herauskam, nachdemlittler
es erstellt wurde.)Das Folgende funktioniert für mich mit MSYS Bash unter Windows - ich habe kein R auf meiner Linux-Box, kann es dort also nicht ausprobieren. Sie benötigen zwei Dateien - die erste mit dem Namen runr führt R mit einem Dateiparameter aus
Sie müssen dies mit chmod + x runr ausführbar machen .
Dann in Ihrer Skriptdatei:
Beachten Sie das #! Die runr-Zeile muss möglicherweise den vollständigen Pfad zu runr enthalten, je nachdem, wie Sie den Befehl verwenden, wie Ihre PATH-Variable festgelegt ist usw.
Nicht schön, aber es scheint zu funktionieren!
quelle