2012-07-11 2 views
6

Sto cercando di utilizzare la funzione R-Markdown in R Studio in cui stavo cercando di stampare grafici generati all'interno di una funzione. Questo è un tipico esempio di cosa sto cercando di fare.Stampa di grafici generati in una funzione utilizzando R Markdown in RStudio

**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 
``` 

Coloro testare questo codice, si prega di accertarsi di salvarlo come file ".RMD" e quindi eseguire il knithtml() nella barra degli strumenti RStudio. Questo codice sopra funziona perfettamente con il tipo di output html che desidero. Tuttavia, quando sostituisco la funzione di tracciamento di base con il codice basato su ggplot, non riesco a ottenere lo knithtml() per produrre l'output ggplot dei 10 grafici che ho ottenuto prima. Il codice di trama di base sopra è ora sostituito dal seguente codice

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

Mi manca qualcosa di molto semplice qui.

VJ

+0

cosa succede se si ha fatto una trama sfaccettata e maglia che? –

+1

No! Finché è all'interno della funzione, non viene stampato. Inoltre, ho appena provato che qplot() produce l'output desiderato mentre ggplot no. Non posso stampare un oggetto ggplot generato all'interno di una funzione, al di fuori di un altro utilizzando ggsave() per salvarlo come pdf ad es. –

+1

All'interno dell'istruzione 'for' o in una funzione, è necessario l'oggetto' print' ggplot2 esplicitamente, quindi prova 'print (p1)'. – kohske

risposta

5

Ci sono due problemi nel codice:

  1. ggplot non riconosce i dati x ei dati y, bacause funziona all'interno dell'ambiente dei dati. Dovresti dargli i nomi delle colonne direttamente.
  2. Il codice nel ciclo yur non ha senso. Non è possibile combinare una trama con un indice ... (il motivo per cui funziona con la trama di base è attraverso un effetto collaterale) L'ho sostituito con il comando di trama semplice.

Quanto segue funziona:

**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

Grazie per la correzione. L'unico motivo per cui ho un indice con la funzione di tracciamento è restituire un oggetto diverso da una funzione (come una tabella di riepilogo) e generare i grafici. Sono sicuro che ci sono modi migliori per farlo, ma questo sembra funzionare per me. Inoltre, mi chiedo perché R non si lamenterebbe della necessità di variabili richieste (x, y) quando si usa il comando plot() nel ciclo for. Ho provato con la stampa e ha funzionato bene. Grazie comunque. –