Ein komplexes Beispiel
Um ein solches R/sweave Dokument zu erklären möchte ich nun ein Beispiel nutzen an dem ich in der letzten Woche gearbeitet habe.
Auf meinem Git-Rpository auf Github kann man ein solches Beispiel anschauen. Ich würde mich freuen, wenn jemand versuchen würde die Präsentation aus den Rohdaten zu reproduzieren (wie man mit git arbeitet wird auf Github gut erklärt. Leider hab ich aus Platzgründen das Projekt mit den umfangreichen Rohdaten von GitHub nehmen müssen. Hier ist das
und hier die
Falls jemand wirklich versuchen möchte das ganze zu reproduzieren, kann er von mir auch noch die Rohdaten haben.
Ich habe absichtlich ein nicht triviales Beispiel verwandt, die Präsentation und das Repository enthalten fast alle Daten, die meine Doktorarbeit bisher produziert hat! Das ist vor allem eine Liste mit 6 Millionen Sequenz-tags zur Genexpressionsanalyse. Bei größeren Projekten mit intensiveren Rechenprozessen stellt die Notwendigkeit zur Neuberechnung nach jeder Änderung im Layout natürlich schnell eine Beschränkung dar (Es gibt in meiner Präsentation einen Rechen-Schritt der 3 Stunden in Anspruch nimmt).
Wer das System zunächst mit weniger komplizierten Dokumenten testen will, wird im Netz viele einfachere Beispiele finden, für LaTeX Artikel aber auch für Präsentationen.
Die R Code Schnipsel werden durch folgende Syntax erkannt.
<< optionen = TRUE/FALSE >>=
Rcode.bespiel <- “hier”
@
wobei man mit optionen wie fig, tex, echo, cache (dazu gleich mehr) etc… das Verhalten, die Art der Umsetzung des Code-Schnipsels steuert: Wird der R-Code ins pdf übernommen, der Output, oder eine Grafik.
Wer sich an solch komplexe Dokumente wagt wird schnell feststellen, dass er nicht nach jeder Änderung im LaTeX-Code alle Berechnungen neu ausführen möchte:
Die Möglichkeit, das System auch für zeitraubende Rechenoperationen zu nutzen kommt erst durch ein “cachen” d.h. Zwischenspeichern von einmal eingelesenen oder erzeugten R-Objekten zustande.
Daher auch die Komplexität und Größe der Datensätze in meinem Repo, ich wollte einfach sehen, was alles möglich ist. Die Antwort: Alles! Es funktioniert! Ein Rekompilieren des “dynamischen Dokuments” dauert unter Nutzung des Caches etwa 20 Sekunden…
Die Vorteile des Systems
Mein Code wird besser! Es ist oft ein langer Weg von einem Perl-Skript über R und Latex zum pdf, dieser wird durch das System nachvollziehbarer. Man will eine spezielle Tabelle oder Grafik erzeugen und schreibt den Code dann wirklich dafür – das ist oft schwer wenn man das pdf nicht vor Augen hat. Ein Beispiel dafür sind die Skripte, die sich hinter
<< cache = TRUE >>=
S <- as.data.frame(read.delim(pipe(“./pilot.pl”),
sep=”,”,
header=FALSE,
as.is=TRUE))
@
verstecken. Ich habe die Perl-Skripte geschrieben, noch bevor ich das System nutzte, sie enthalten viele unnötig komplexe Datenstrukturen, die nicht wirkliche gebraucht werden.
Im Code den ich für das System geschrieben habe (besonders in dem ausgeführten Perl-Skript) gehe ich viel zielgerichteter vor.
<< cache = TRUE, echo = FALSE >>=
cov454 <- as.data.frame(read.delim(pipe(“./tgicl_coverage.pl -a Ac_FM08.ace -s singletons.fasta”)))
exp <- merge(exp.tab,cov454)
exp_plot <- qplot(exp$raw.count, exp$coverage)+ scale_x_log10(“number of tags observed”)+ scale_y_log10(“Coverage by 454″)+ geom_smooth(method=”lm”)
@
Hier wird auch deutlich, dass für die Produktion von Publikationen R den präziseren, besseren Code erlaubt. Die Datenstrukturen sind einfach übersichtlicher als in den meisten anderen Programmiersprachen. Eines meiner Ziele wird daher sein Helferskripte klein zu halten und mehr Code direkt in R zu schreiben.
Als weiteren Effekt habe ich einfach mehr Ordnung3! Ich weiß wo mein Code ist und dass es die richtige Version des Codes ist.
Weiter Herausforderungen
Durch Nutzen der R-Funktion pipe, die ein Kommando des Betriebssystems ausführen kann werden alle Werkzeuge auch außerhalb von R nutzbar. Man kann so eigene SKripte oder komplexe Programme auszuführen um Datenobjekte einzulesen. Solcher Input-Code stellt dann aber wieder eine Herausforderung für die gecachten Objekte dar:
Änderungen an Helferskripten sollten vor Nutzung der gespeicherten Objekte kontrolliert werden. Bei einer Änderung in einem Skript, Programm oder den Rohdaten sollten die gespeicherten Objekte nur nach Ausgabe einer Warnung benutzt werden und gegebenenfalls auf einer Löschung und Neuberechnung der Objekte bestanden werden.
Kommentare (3)