2013-03-19 8 views
8

Nie jestem pewien, czy jest to prawdziwy błąd, czy czegoś brakuje, ale tutaj jest. Mam funkcję ggplot (plot_data), którą chciałbym wywołać w pętli. Uwzględniłem funkcję we własnej części. Wywołanie funkcji działa dobrze w pętli na wypadek, gdyby jeden (fragment zatytułowany "działa"), w tym przypadku po funkcji działka_podpisywana jest plamka. Jednak w drugim przypadku po funkcji plot_data() następuje mapa termiczna, ale mapa ciepła, w sposób dziwny, blokuje funkcję plot_data. Zdarza się to niezależnie od tego, czy funkcja plot() lub print() jest wywoływana wokół funkcji działka_danych.knitr: wywołanie funkcji ggplot2 w pętli nie jest drukowane, gdy towarzyszą jej niektóre inne funkcje drukowania

Czy istnieje sposób, aby ggplots zachowywać się z dzianin? A jak w piekle jest wywołanie funkcji tłumiące wyjście poprzedniego wywołania funkcji?

Następujący kod powtarza błąd dla mnie:

[preamble omitted] 
\begin{document} 

<<setup, eval=TRUE, echo=FALSE, cache=FALSE>>= 
plot_data <- function(data) { 
    require(ggplot2) 
    require(reshape) 
    d.melt <- melt(data) 
    ggplot(data=d.melt, aes(x=X2, y=value, group=X1, colour=X1)) + geom_line(size=.5) + 
      scale_x_discrete("") + 
      scale_y_continuous("Value") 
    } 
@ 

<<works, echo=FALSE, results='asis', out.width='.3\\linewidth', dev='pdf', cache=TRUE >>= 
set.seed(10010) 
data <- matrix(runif(10000, 1,100), ncol=100) 
for (i in 1:10) { 
    ind <- sample(1:100, 10) 
    plot(plot_data(data[ind,])) 
    barplot(ind) 
} 
@ 

<<doesnt-work, echo=FALSE, results='asis', out.width='.3\\linewidth', dev='pdf', cache=TRUE >>= 
set.seed(10010) 
data <- matrix(runif(10000, 1,100), ncol=100) 
for (i in 1:10) { 
    ind <- sample(1:100, 10) 
    plot(plot_data(data[ind,])) # calling print instead of plot doesn't work either 
    heatmap(data[ind,] ) 
} 
@ 

\end{document} 
+0

To jest długie ujęcie, ale jest 'par (" ask ")' TRUE? –

+1

Co z '<>' w obrębie każdego fragmentu (nie to, że zmienia problem)? dlaczego nie ustawić 'eval = TRUE' w' setup' i nie zawracać sobie głowy wywołaniem go po tym? – mnel

+0

sebastian-c: no par ("ask") zwraca wartość false. – zzk

Odpowiedz

3

Chyba zadać wiele z knitr. Wyrównywanie podstawowej grafiki i grafiki siatki nie jest łatwe i trudne w R. Nie wiem, jak to zrobić knitr za pomocą (pakiet lateksowy graphics), ale myślę, że kiedy dzwonisz na heatmap, jest drukowany w tym samym miejscu z działki siatki.

Dodawanie plot.new przed wywołaniem grafiki bazowe działa dobrze dla mnie:

<<doesnt-work, fig.show='hold',out.width='.3\\linewidth'>>= 
    set.seed(10010) 
data <- matrix(runif(10000, 1,100), ncol=100) 
for (i in 1:3) { 
    ind <- sample(1:100, 10) 
    print(plot_data(data[ind,])) # calling print instead of plot doesn't work either 
    plot.new() 
    heatmap(data[ind,] ) 
} 
@ 
+0

to jest odpowiednia odpowiedź, dziękuję! Zapomniałem o spisku.new. – zzk

0

Jest błąd w funkcji Myślę, zmienne ze stopu są wyłączone. To zadziałało dla mnie:

library(ggplot2) 
library(reshape2) 
set.seed(10010) 
data <- matrix(runif(10000, 1,100), ncol=100) 
for (i in 1:3) { 
    ind <- sample(1:100, 10) 

    d.melt <- melt(data[ind,]) 
    p<-ggplot(data=d.melt, aes(x=Var1, y=Var2, group=Var1, colour=Var1)) + 
     geom_line(size=.5) + 
     scale_x_discrete("") + 
     scale_y_continuous("Value") 

    print(p) 
    plot.new() 
    heatmap(data[ind,] ) 
} 
Powiązane problemy