2013-09-26 13 views
9

Ist es möglich, Plot-Generierung Code zwei Versionen der gleichen Figur, in verschiedenen Größen, aus einem .Rmd Dokument ausgeben? Entweder durch Chunk-Optionen (ich habe nichts gesehen, was direkt hier funktioniert), oder durch einen benutzerdefinierten knitr Haken? Vorzugsweise würde dies mit dem png Gerät gemacht werden.Produzieren zwei Plots aus dem gleichen Chunk/Anweisung in knitr

Meine Motivation: Ich möchte in der Lage sein, eine Zahl in einer Größe auszugeben, die in ein kompiliertes HTML-Dokument passen würde, und eine andere Zahl, die ein Benutzer nach dem Klicken anzeigen könnte (think fancybox). Ich denke, dass ich in der Lage sein werde, mit den Skripten umzugehen, die nötig sind, um das zu machen. aber zuerst muss ich R/knitr davon überzeugen, zwei Versionen der Figur auszugeben.

Obwohl ich mir sicher bin, dass es Problemumgehungen gibt, wäre es am besten, wenn es einen Weg gäbe, um hinter den Kulissen "nur zu arbeiten", z. durch einen knitr Haken. Auf diese Weise müssen wir dem R-Code innerhalb eines Chunks nichts Besonderes tun, wir modifizieren nur, wie wir diesen Chunk parsen/auswerten.

Alternativ könnte man SVG-Grafiken verwenden, die gut skalieren würden, aber dann verlieren wir die gute Schlussfolgerung von guten Größen für die Plot-Beschriftungen und Vektorgrafiken sind nicht gut für Plots mit vielen vielen Punkten.

Antwort

13

Ich dachte, es gab keine Lösung, und war im Begriff, nein zu @baptiste, aber bekam eine hack mir bald in den Sinn. Unten ist ein Beispiel R Markdown:

```{r test, dev='png', fig.ext=c('png', 'large.png'), fig.height=c(4, 10), fig.width=c(4, 10)} 
library(ggplot2) 
qplot(speed, dist, data=cars) 
``` 

See the [original plot](figure/test.png) and 
a [larger version](figure/test.large.png). 

Der Grund, warum ich dachte, die vektorisierte Version von dev nicht funktionieren würde, war: für dev=c('png', 'png') wird die zweite png-Datei die erste überschreiben, da die Zahl Dateiname gleich ist. Dann erkannte ich, fig.ext wurde auch vektorisiert, und eine Dateierweiterung wie large.png zerstört nicht wirklich die Dateierweiterung png; Deshalb ist es ein Hack.

Wie auch immer, durch vektorisiert Versionen von dev, fig.ext, fig.height und fig.width, können Sie die gleiche Handlung, um mehrere Versionen speichern. Wenn Sie ein deterministisches Muster für die Bilddateierweiterungen verwenden, können Sie, glaube ich, auch JavaScript-Code erstellen, um die Effektboxen automatisch an Bilder anzuhängen.

+0

Perfekt! Danke Yihui! –

0

Wenn Sie nur die kleine und große Zahl benötigen, können Sie einfach tun:

<<plotSmall, fig.height=6, fig.width=8, out.width='.1\\textwidth'>>= 
plot(...) 
@ 
<<plotBig, fig.height=6, fig.width=8, out.width='.99\\textwidth'>>= 
plot(...) 
@ 

Oder einfacher:

<<plotBoth, fig.height=6, fig.width=8, out.width=c('.1\\textwidth', '.9\\textwidth')>>= 
plot(...) 
plot(...) 
@ 

(sicher, dass Sie das wissen, aber .Rmd ist für LaTeX, während .Rhtml ist für HTML - die .Rhtml-Syntax ist etwas anders.)

Verwandte Themen