2016-05-12 6 views
4

Ich schreibe eine Erklärung eines Plots, wo ich im Grunde das Plot in einem ersten Chunk erstellen, dann diese Ausgabe beschreiben und eine Achse in einem zweiten Chunk hinzufügen werde.Splitten eines Plotaufrufs über mehrere Chunks

Es scheint jedoch, jeder Abschnitt erzwingt eine neue Zeichenumgebung, so erhalten wir einen Fehler beim Versuch, einen Chunk mit axis allein zu führen. Beachten Sie:

--- 
output: html_document 
--- 

```{r first} 
plot(1:10, 1:10, xaxt = "n") 
``` 

Look, no x axis! 

```{r second} 
axis(side = 1, at = 1:10) 
``` 

Fehler in axis(side = 1, at = 1:10): plot.new wurde nicht genannt noch Anrufe: <Anonymous> ... withCallingHandlers ->withVisible ->eval ->eval ->axis Ausführung gestoppt

Offensichtlich ist dies eine gültige Problemumgehung, die identische-Ausgabe hat:

--- 
output: html_document 
--- 

```{r first} 
plot(1:10, 1:10, xaxt = "n") 
``` 

Look, no x axis! 

```{r second, eval = FALSE} 
axis(side = 1, at = 1:10) 
``` 
```{r second_invisible, echo = FALSE} 
plot(1:10, 1:10, xaxt = "n") 
axis(side = 1, at = 1:10) 
``` 

Aber das ist weniger als ideal (dupliziert Code, zweimal die Handlung zu bewerten ist, etc.)

This Frage verwandt ist - zum Beispiel könnten wir die second Brocken und setzen echo = -1 auf der second_invisible ausschließen Chunk (dies würde auch nicht in meiner Anwendung funktionieren, aber ich möchte die Dinge hier nicht übermäßig komplizieren)

Gibt es keine Option wie dev.hold, die wir an den ersten Chunk senden können?

+0

Es scheint, dass in dem ersten Codeblock, versuchen, die Achse zu einem bereits vorhandenen Plot hinzufügen Sie (nur eine Parzelle), wo in Im zweiten Block fügen Sie die Achse zu einem neuen duplizierten Plot hinzu (d. h Sie haben zwei Versionen der Handlung, eine ohne die Achsen und eine mit, was Sie wirklich wollen). Mit anderen Worten, Sie erwarten/hoffen, dass es im zweiten Chunk automatisch den Plot für Sie dupliziert (sie sind wirklich zwei getrennte Versionen des Plots). Die damit verbundene Frage scheint nicht zu versuchen, mehr als eine Handlung zu erstellen. – steveb

+0

In Sweave/noweb-Syntax können Sie <> verwenden, um den Code aus dem ersten Chunk in einem späteren einzufügen, aber ich kenne keine Entsprechung in Markdown-Syntax. – user2554330

+0

@ user2554330 hmm, klingt etwas vielversprechend. Ich sehe immer noch das Problem, dass der Code zweimal ausgewertet werden muss. – MichaelChirico

Antwort

2

Sie aussehen könnte, in die Verwendung recordPlot

--- 
output: html_document 
--- 

```{r first} 
plot(1:10, 1:10, xaxt = "n") 
x<-recordPlot() 
``` 

Look, no x axis! 

```{r second} 
replayPlot(x) 
axis(side = 1, at = 1:10) 

``` 

Quellen:

R: Saving a plot in an object

R plot without showing the graphic window

https://stat.ethz.ch/R-manual/R-devel/library/grDevices/html/recordplot.html < - beachten Sie die Hinweise über ggplot2 hier

+0

Dies erzeugt nicht die Ausgabe von _exact_ von oben. Du brauchst 'echo = -2' in' first' und 'echo = -1' in' second'. Aber ich denke, du bist auf etwas. – MichaelChirico

+0

Ich bin nicht vertraut mit 'echo = -2', etc., Das ist ein Knitr-Parameter richtig? Ich habe versucht, es hinzuzufügen und konnte den Unterschied nicht sofort sehen.Wenn Sie sich Sorgen machen, dass die Handlung den Code-Chunk aufteilt, könnte eine einfache (aber offensichtlich begrenzte) Lösung darin bestehen, den Code in eine Zeile zu setzen: "plot (1:10, 1:10, xax =" n); x <-recordPlot() ' – user5359531

+0

Es ist mehr, dass ich nicht möchte, dass meine Ausgabe' x <- recordPlot 'oder' replayPlot' enthält - ich möchte das von meinen Benutzern verdecken, da es für das nicht relevant ist. Ich versuche zu zeigen (es ist nur ein Artefakt der Workaround, die wir uns vorstellen). 'echo = -2' sollte nur die erste Zeile des Codes ausgeben (außer der zweiten). – MichaelChirico

2

Sie können eine Option festlegen global.device ein persistentes grafisches Gerät zu öffnen:

--- 
output: html_document 
--- 

```{r setup, include=FALSE} 
knitr::opts_knit$set(global.device = TRUE) 
``` 

```{r first} 
plot(1:10, 1:10, xaxt = "n") 
``` 

Look, no x axis! 

```{r second} 
axis(side = 1, at = 1:10) 
``` 
Verwandte Themen