2012-07-11 96 views
6

Tôi đang cố gắng sử dụng tính năng R-Markdown trong R Studio nơi tôi đang cố gắng in các ô được tạo bên trong một hàm. Đây là một ví dụ chạy xuống cơ bản về những gì tôi đang cố gắng làm.Các ô in được tạo trong một hàm bằng cách sử dụng R Markdown trong 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 
``` 

Những thử nghiệm mã này, hãy chắc chắn để lưu nó dưới dạng file ".Rmd" và sau đó chạy knithtml() trong thanh công cụ RStudio. Đoạn mã trên hoạt động hoàn toàn tốt với loại đầu ra html mà tôi mong muốn. Tuy nhiên, khi tôi thay thế hàm vẽ nền bằng mã dựa trên ggplot, tôi không thể nhận được knithtml() để tạo ra đầu ra ggplot của 10 ô mà tôi đã có trước đây. Mã lô cốt cơ bản ở trên bây giờ được thay thế bằng mã sau đây

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

Tôi thiếu cái gì đó rất đơn giản ở đây.

VJ

+0

gì nếu bạn đã thực hiện một âm mưu diện và đan đó? –

+1

Không! Miễn là nó nằm bên trong hàm, nó không được in. Ngoài ra, tôi vừa thử nghiệm qplot() tạo ra kết quả mong muốn trong khi ggplot thì không. Tôi không thể in một đối tượng ggplot được tạo bên trong một hàm, bên ngoài khác bằng cách sử dụng ggsave() để lưu nó dưới dạng pdf ví dụ: –

+1

Bên trong câu lệnh 'for' hoặc trong một hàm, bạn cần đối tượng' print' ggplot2 rõ ràng, vì vậy hãy thử 'print (p1)'. – kohske

Trả lời

5

Có hai vấn đề trong mã của bạn:

  1. ggplot không nhận ra dữ liệu x và y dữ liệu, bacause nó hoạt động trong môi trường dữ liệu. Bạn nên đặt tên cột trực tiếp.
  2. Mã trong vòng lặp yur không có ý nghĩa. Bạn không thể kết hợp một âm mưu với một chỉ mục ... (lý do nó làm việc với cốt truyện cơ bản là thông qua một tác dụng phụ) Tôi đã thay thế nó bằng lệnh lô đơn giản.

Sau đây sẽ làm việc:

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

Cảm ơn bạn đã sửa chữa. Lý do duy nhất tôi có một chỉ mục với chức năng vẽ đồ thị là trả về một đối tượng khác từ một hàm (như bảng tóm tắt) cùng với việc tạo ra các ô. Tôi chắc chắn có những cách tốt hơn để làm điều này, nhưng điều này dường như làm việc cho tôi. Ngoài ra, tôi tự hỏi tại sao R sẽ không phàn nàn sự cần thiết phải biến cần thiết (x, y) khi sử dụng lệnh plot() trong vòng lặp for. Tôi đã thử in và nó hoạt động tốt. Dù sao cũng cảm ơn. –

Các vấn đề liên quan