2012-07-11 4 views
6

Ich versuche, die R-Markdown-Funktion in R Studio zu verwenden, wo ich Plots drucken wollte, die in einer Funktion generiert wurden. Dies ist ein grundlegendes heruntergekommenes Beispiel dessen, was ich versuche zu tun.Drucken von Plots, die in einer Funktion mit R Markdown in RStudio erstellt wurden

**Test printing plots generated in a function** 
================================================ 

``` {r fig.width=8, fig.height=4, warning=FALSE, eval=TRUE, message=FALSE, tidy=TRUE, dev='png', echo=FALSE, fig.show='hold', fig.align='center'} 
dat <- data.frame(x=c(1:10),y=c(11:20),z=c(21:30),name=rep(c("a","b"),each=5)) 
library(ggplot2) 

ex <- function(data){ 

    plot(data[,1],data[,2]) 
    plot(data[,1],data[,3]) 
} 

for (i in 1:10){ 
t1 <- rbind(i,ex(dat)) 
} 
t1 
``` 

Diejenigen, diesen Code zu testen, stellen Sie sicher, dass es als ".Rmd" Datei speichern und dann die knithtml() in RStudio Symbolleiste ausführen. Dieser Code oben funktioniert absolut gut mit der Art von HTML-Ausgabe, die ich wünsche. Wenn ich jedoch die Basis-Plotfunktion durch ggplot-basierten Code ersetze, kann ich die knithtml() nicht erhalten, um die ggplot-Ausgabe der 10 Plots zu erzeugen, die ich vorher erhalten habe. Der obige Grundplot-Code wird nun durch folgenden Code ersetzt:

p1 <- ggplot(data=data, aes(x=data[,1],y=data[,2])) 
    p1 <- p1+geom_point() 
    p1 

Fehle ich hier etwas sehr Einfaches.

VJ

+0

Was passiert, wenn Sie eine facettierte Handlung und stricken das machte? –

+1

Nein! Solange es sich in der Funktion befindet, wird es nicht gedruckt. Außerdem habe ich gerade getestet, dass qplot() die gewünschte Ausgabe erzeugt, während ggplot dies nicht tut. Kann ich ein in einer Funktion generiertes ggplot-Objekt nicht außerhalb von ggSave() ausgeben, um es als PDF zu speichern, z. –

+1

Innerhalb 'for' Anweisung oder in einer Funktion, müssen Sie' print' ggplot2 Objekt explizit, also versuchen Sie 'print (p1)'. – kohske

Antwort

5

Es gibt zwei Probleme im Code:

  1. ggplot erkennt nicht die Daten x und y-Daten, bacause es in der Datenumgebung funktioniert. Sie sollten ihm die Spaltennamen direkt geben.
  2. Der Code in Ihrer Schleife macht keinen Sinn. Sie können ein Diagramm nicht mit einem Index mischen ... (der Grund dafür, dass es mit dem Basisdiagramm über einen Nebeneffekt arbeitet), habe ich durch den einfachen Diagrammbefehl ersetzt.

Die folgende funktioniert:

**Test printing plots generated in a function** 
================================================ 

``` {r fig.width=8, fig.height=4, warning=FALSE, eval=TRUE, message=FALSE, tidy=TRUE, dev='png', echo=FALSE, fig.show='hold', fig.align='center'} 
dat <- data.frame(x=c(1:10),y=c(11:20),z=c(21:30),name=rep(c("a","b"),each=5)) 
library(ggplot2) 

ex <- function(data){ 
    p1 <- ggplot(data=data, aes(x=x,y=y)) 
    p1 <- p1+geom_point() 
    return(p1) 
} 

for (i in 1:2){ 
plot(ex(dat)) 
} 

``` 
+0

Danke für die Lösung. Der einzige Grund, warum ich einen Index mit der Plotfunktion habe, ist, ein anderes Objekt von einer Funktion (wie eine Übersichtstabelle) zusammen mit dem Erzeugen der Plots zurückzugeben. Ich bin sicher, es gibt bessere Möglichkeiten, dies zu tun, aber das schien für mich zu funktionieren. Außerdem frage ich mich, warum R nicht die Notwendigkeit von Variablen (x, y) beanstanden würde, wenn der Befehl plot() in der for-Schleife verwendet wird. Ich habe es mit Druck versucht und es hat gut funktioniert. Trotzdem danke. –