2012-07-11 92 views
6

我試圖在R Studio中使用R標記功能,其中我試圖打印在函數內部生成的圖。這是我試圖做的一個基本的運行示例。在RStudio中使用R Markdown生成功能中的打印圖

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

那些測試此代碼,請務必將其保存爲「.Rmd」文件,然後運行在RStudio工具欄knithtml()。上面的代碼對於我希望的html輸出的類型來說絕對正確。但是,當我用基於ggplot的代碼替換基本繪圖函數時,我無法得到我以前得到的10個繪圖的ggplot輸出。上面的底圖代碼現在被以下代碼所取代

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

我在這裏丟失了一些非常簡單的東西。

VJ

+0

如果有什麼你犯了一個層面的情節及編織品是什麼? – 2012-07-11 16:12:21

+1

不!只要它在功能內部,它就不會被打印。另外,我只是測試了qplot()產生所需的輸出,而ggplot沒有。我不能打印在函數內生成的ggplot對象,除了使用ggsave()將其另存爲pdf – 2012-07-11 16:35:50

+1

在'for'語句或函數內部,你需要明確地print'ggplot2對象,所以試試'print(p1)'。 – kohske 2012-07-11 16:53:16

回答

5

有兩個問題在你的代碼:

  1. ggplot不能識別數據x和y的數據,bacause它的工作原理數據環境中。你應該直接給它列名。
  2. yur循環中的代碼沒有意義。你不能將一個繪圖與一個索引混合...(它與基本繪圖一起工作的原因是通過副作用),我用簡單的繪圖命令替換了它。

下面的工作:

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

感謝您的修復。我使用繪圖函數創建索引的唯一原因是從函數(如彙總表)返回不同的對象,並生成繪圖。我確信有更好的方法來做到這一點,但這似乎對我有用。另外,我想知道爲什麼R在for循環中使用plot()命令時不會抱怨需要變量(x,y)。我嘗試打印,它工作得很好。不管怎麼說,多謝拉。 – 2012-07-11 17:26:38