Rscript und Python

Ich hatte am Anfang des Jahres bei einem MOOC über Statistik mit R mitgemacht. Es war aus reinem Interesse. Ich habe an dem Kurs in meiner freien Zeit zu Hause teilgenommen. Ich hatte vorher von R gehört, weil ein Programm, mit dem ich eine Zeit lang arbeiten musste, R benutzte, und es musste auf meinem Rechner installiert werden. Und ich dachte, wenn ich mich weg bewerben will, wäre es nicht verkehrt, Kenntnisse über R zu haben.

Ich fand R ehrlich gesagt nicht so toll. Es ist eine mächtige Programmiersprache, um statistische Rechnungen durchzuführen, keine Frage. Die Benutzung fand ich sehr gewöhnungsbedürftig. Die Namen der Funktionen sind nicht immer nachvollziehbar und ohne erkennbare Systematik vergeben worden. Ich habe den Kurs zwar bestanden, aber immer gedacht, wenn ich R brauche, ist es am einfachsten, zu googeln, als mir zu überlegen, wie etwas gemacht wird.

Gebraucht habe ich R viel schneller als gedacht. Zwei Wochen später habe ich mich im Rahmen meiner Arbeit dafür interessiert, wie man hierarchische Clusteranalysen durchführt. Mir ging es darum, experimentelle Daten von verschiedenen Proben einer Substanz miteinander zu vergleichen. R war perfekt dafür. Mit gerade vier Zeilen Code hatte ich schon das gewünschte Ergebnis in Form eines Dendogrammes, obwohl solche Analysen nicht Teil vom Kurs waren.

Das war erst der Anfang. Danach ging mir durch den Kopf, dass ich eine solche Analyse in meinem Programm#2 gut gebrauchen könnte, als zusätzliche Information, und um Entscheidungen besser treffen zu können. Ich wollte eine große Anzahl von Modellen nach Ähnlichkeit sortieren.

Während des Kurses hatten wir mit einer graphischen Oberfläche gearbeitet. R kann man aber auch aus der Kommandozeile im Terminal benutzen, wie es eigentlich ursprünglich nur ging. Da ich es innerhalb von meinem Programm aufrufen wollte, sollte ich die Befehle der Kommandozeile benutzen. Diese werden aber nur von R interpretiert, wenn man R gestartet hat. Für die, die gnuplot im Terminal schon benutzt haben: So ähnlich ist es mit R auch.

Ich wusste zuerst nicht, wie ich vorgehen sollte, bis ich über Rscript gelesen habe. Es macht genau das, was ich wollte. Wenn man die Befehle für R in einer Datei gespeichert hat, nennen wir diese Befehle.R, kann man sie mit Rscript in R durchführen lassen. So:

Rscript Befehle.R

Von Programm#2 aus, das mit Python geschrieben wurde, sieht dann die Ausführung so aus:

import subprocess
Rins = open('Befehle.R', 'r')
Rout = open('R.log', 'w')
proc = subprocess.Popen("Rscript", stdin=Rins, stdout=Rout, stderr=Rout)
proc.wait()

Es hat nicht geklappt. Eine Fehlermeldung gab es nicht, mein Programm hat getan, als ob alles super gelaufen wäre. Die Befehle wurden richtig in den Befehle.R Dateien geschrieben. Die Dendogramme, die ich in PNG Dateien speichern wollte, wurden nicht erstellt. Die Dateien R.log waren leer, so dass ich nicht mal wusste, wo das Problem lag.

Vom Terminal aus, habe ich Rscript Befehle.R ausgeführt. Das hat funktioniert. Praktikabel ist es aber nicht, weil ich eigentlich Tausenden von solchen Rechnungen machen lassen wollte, für verschiedene Teile von den Modellen, und dafür die Jobs zu einem Pool geschickt hatte, um sie mit unserem Hochleistungsrechner parallel laufen zu lassen. Es musste von meinem Programm aus laufen können.

Im Terminal habe ich Python gestartet und die Befehle eingegeben. Diesmal wurde in die R.log Datei geschrieben. Drin war eine für mich kryptische Fehlermeldung, die so endet, nachdem die Hilfe von Rscript ausgedruckt wurde:

'file' may contain spaces but not shell metacharacters
Expressions (one or more '-e <expr>') may be used instead of 'file'
See also ?Rscript from within R

Nicht nachvollziehbar. Die Eingabedatei Befehle.R hatte doch keine Shell-Metazeichen in ihrem Namen enthalten. Am Ende habe ich den Code so geändert, und das hat geklappt:

import shlex, subprocess
Rcommand = "Rscript Befehle.R"
Rins = open('Befehle.R', 'r')
Rout = open('R.log', 'w')
proc = subprocess.Popen(shlex.split(Rcommand), stdout=Rout, stderr=Rout)
proc.wait()

Warum es bei der ersten Variante nicht funktioniert hat, weiß ich immer noch nicht. Es muss damit zusammen hängen, wie mit stdin die Eingabedatei zum Programm übergeben wird.

Advertisements

Ein Gedanke zu “Rscript und Python

  1. Ich habe während meiner Masterarbeit nur ein einziges Mal aus Verzweiflung geheult. Das war wegen R. Es war ein riesiger Kampf, aber es hat sich am Ende gelohnt. Ich finde, R ist eine sehr logische Sprache, sodass man sie gut anwenden kann, sobald man mal über den kritischen Punkt hinweg ist.

    Gefällt 1 Person

Teile deine Meinung mit!

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s