RScript

R-Skripte automatisieren

Kann man R-Skripte automatisieren, also automatisch starten und durchlaufen lassen?

Ja, das geht. Und in diesem Post zeige ich, dass es eigentlich ganz einfach ist, was man dafür braucht und worauf zu achten ist.

Unser Mini-Skript

Für unser Automatisierungsprojekt brauchen wir ein kleines Skript, das wir automatisieren möchten. Angenommen wir interessieren uns für den Kurs der Adidas-Aktie an der Börse und möchten uns täglich den Verlauf der letzten zwei Monate als Grafik abspeichern. Wie machen wir das? Zuerst schreiben wir einfach unser Skript; der Schritt der Automatisierung kommt danach. Gerade bei automatisierten Skripts sollte man sich ganz sicher sein, was der Arbeitspfad ist. Deswegen sollten wir ihn klar angeben, bei mir ist das folgender: setwd("D:/r-coding.de/r-skripte-automatisieren"). Weiter gehts.

Zum Glück gibt es in R so viele gute „packages“, die für bestimmte Themen goldwert sind. Für die technische Analyse von Aktienkursen ist zum Beispiel das package quantmod zu empfehlen. Ist dieses noch nicht installiert, können wir das jetzt einmalig machen: install.packages("quantmod"). Diese Zeile muss auch nicht in das Skript; wir müssen nur sicher sein, dass wir diese Bibliothek installiert haben. Allerdings müssen wir das package laden: library(quantmod). Die historischen Kursdaten der Adidas-Aktie sind ganz einfach mit getSymbols zu bekommen: ADS <- getSymbols("ADS.DE", auto.assign=FALSE). Da die Daten von yahoo finance gezogen werden, brauchen wir eine Internetverbindung. Nun haben wir ein xts-Objekt ("extended time series object") mit den Kursdaten.

Wir wollen keine großen Analysen oder sonstwas durchführen, sondern lediglich die letzten zwei Monate anzeigen lassen und als Grafik abspeichern - zum Beispiel als PNG. Wir öffnen dazu ein "graphic device": png("adidas_recent.png"). Dies hat zur Folge, dass darauffolgende Plot-Funktionen in die angegebene Datei "adidas_recent.png" schreiben werden. Genau das tun wir jetzt und erstellen einen Candlestick-Chart candleChart(ADS, theme="white", subset="last 2 months"). Nicht wundern: da wir als Grafikschnittstelle nun die PNG-Datei haben sehen wir keinen Plot in RStudio. Anschließend schließen wir noch die Umleitung in die PNG-Datei: dev.off() (für "device off"). Und schon haben wir ein kleines Skript, das die letzten zwei Monate des Adidaskurses grafisch darstellt und in eine Datei schreibt. Dieses Skript soll nun automatisiert werden.

Rscript.exe

Mit der Installation von R kommt auch die Datei Rscript.exe, welche perfekt für die Automatisierung von R-Skripten ist. Die Arbeit mit Rscript.exe ist also auf jeden Fall the way to go - z.B. für tägliche R-Jobs. So können wir (nahezu) jedes R-Skript direkt über die Eingabeaufforderung mit Rscript.exe zum Laufen bringen. Die Datei finden wir übrigens im bin-Ordner von unserer R-Installation. Üblicherweise unter C:\Program Files\R\\bin, wobei "" beispielsweise "R-3.3.1" sein kann. Öffnen wir die Eingabeaufforderung ("cmd" unter Start->Ausführen bzw. in der Windows-Suchleiste), können wir unsere R-Datei von der Konsole aus laufen lassen: "C:\Program Files\R\R-3.3.1\bin\Rscript.exe" "D:\r-coding.de\r-skripte-automatisieren\r-skripte-automatisieren.R". Das Prinzip ist hier also "Rscript-Pfad R-Datei".

Batchdateien

Wir machen es uns jetzt noch etwas einfacher und gehen den Weg über eine Batchdatei (Dateiendung: BAT). Dazu erstellen wir z.B. ein neues Textdokument und ändern später die Dateiendung zu .bat. In diese Datei schreiben wir nun folgende Zeile: SET PATH=%PATH%;C:\Program Files\R\R-3.3.1\bin. Mit dieser Zeile setzen wir den Pfad zu Rscript.exe, was uns in den nächsten Zeilen erlaubt, einfach nur noch "Rscript" zu schreiben. Dies ist besonders hilfreich, wenn wir Rscript häufiger ausführen möchten. In die nächste Zeile kommt nun unser Aufruf der R-Datei: Rscript D:\r-coding.de\r-skripte-automatisieren\r-skripte-automatisieren.R. Das wars schon - wir können unser Skript nun mit einem Doppelklick auf die bat-Datei ausführen.

Aufgabenplanung

Nun haben wir eine Datei, die, wenn sie ausgeführt wird, genau unseren R-Job macht. Jetzt wird es Zeit, diese Datei täglich zu starten. Dazu gehen wir in die Windows-Aufgabenplanung (z.B. unter Systemsteuerung -> System und Sicherheit -> Verwaltung -> Aufgabenplanung). Wir klicken oben links auf "Aufgabenplanungsbibliothek" und sehen nun in der Mitte eine Liste mit (oder zur Zeit noch ohne) Aufgaben, die definiert wurden. Wir erstellen eine Aufgabe mit Rechtsklick -> "Neue Aufgabe erstellen".

Aufgabenplanung - Allgemein

Als erstes sehen wir den Tab "Allgemein". Wir geben hier einen Namen für unsere Aufgabe ein und optimalerweise eine Beschreibung, die den Job klar erklärt. Der Autor ist automatisch der Windows-Username, und um den Speicherort muss sich auch nicht gekümmert werden. Allerdings sind die Sicherheitsoptionen interessant, wenn es um Automatisierung auf einem Server geht. Für Business-Jobs empfiehlt sich hier, einen extra Service-Account zu erstellen, welcher nur die Rechte besitzt, die er braucht und nicht mehr. Ebenso muss dieser "User" nicht angemeldet sein. Wählt man über "Benutzer oder Gruppe ändern..." diesen Service-Account aus, so wird man üblicherweise aufgefordert, das entsprechende Passwort einzugeben; anschließend wird dieses Benutzerkonto für den Job benutzt. Hier ist es wichtig zu beachten, dass der Service-Account auch alle Rechte für den Job selbst braucht - wird zum Beispiel auf eine Datenbank zugegriffen, müssen entsprechende Rechte vergeben werden.

Aufgabenplanung - Trigger

Im nächsten Tab können wir sogenannte Trigger setzen. In unserem Fall brauchen wir einen zeitlichen Trigger. Wir starten die Aufgabe also "Nach einem Zeitplan" und wählen "Täglich" aus. Wir definieren das Startdatum und die Zeit, und geben an, wie oft der Job wiederholt werden soll. Trigger können Events sein, der Systemstart, oder die Anmeldung eines Benutzers.

Aufgabenplanung - Aktionen

Zu guter Letzt definieren wir die Aktionen, die stattfinden sollen. In unserem Fall brauchen wir nur eine, welche wir mit "Neu..." erstellen. Wir möchten ein "Programm starten" und geben unten das entsprechende Programm bzw. Skript an. Hier suchen wir nach unserer bat-Datei. Da wir noch keine Argumente an unsere R-Datei übergeben (dazu mehr in einem zukünftigen Post) lassen wir dieses Feld leer. Ebenso müssen wir es nicht in einer bestimmten Umgebung starten, da wir absolute Pfade in unseren Dateien angegeben haben.

Die Tabs "Bedingungen" und "Einstellungen" bieten noch weitere Möglichkeiten, die Aufgabe anzupassen, aber da die Standard-Einstellungen völlig ausreichend sind, werde ich darauf nicht näher eingehen. Voilà! Wir haben unsere tägliche Aufgabe erstellt. Wenn alles geklappt hat, sollte nun täglich um 00:00 Uhr eine aktuelle Version der "adidas_recent.jpg" im Projektordner erstellt werden. Natürlich ist 00:00 Uhr vielleicht etwas unpraktikabel, wenn man keinen Server im Dauerbetrieb hat. Eine Möglichkeit wäre hier den Trigger in der Aufgabenplanung einfach auf "Beim Start" oder "Bei Anmeldung" zu setzen. So hat man auf jeden Fall immer die aktuelle Grafik, sobald man anfängt am PC/Laptop zu arbeiten.

Hast du noch mehr Fragen zu Automatisierung in R oder ein anderes Problem mit R? Schreib mir einfach eine Mail: mail@r-coding.de.
Bleib außerdem auf dem Laufenden mit dem r-coding Newsletter. Du erhältst Infos zu neuen Blogeinträgen, sowie kleine Tipps und Tricks zu R. Melde dich jetzt an: http://r-coding.de/newsletter.

Viel Erfolg beim Automatisieren!

3 Kommentare

    1. Hallo Kerkering, sehe ich genauso! Ich denke, dass solche Automatisierungen in vielen Bereichen eingesetzt werden können.
      Interessieren dich weitere Themen, die ich in einem nächsten Post behandeln kann?
      Beste Grüße

  1. Und wieder was gelernt! Danke für den Beitrag 🙂 Es wäre noch cool zu wissen, was man mit quantmod, getSymbols und candleChart noch anstellen kann. Die Hilfedateien sind meistens eher verwirrend als klar ersichtlich.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.