2013-03-19 3 views
8

Я не уверен, что это настоящая ошибка, или я что-то упускаю, но здесь это происходит. У меня есть функция ggplot (plot_data), которую я бы хотел вызвать в цикле. Я включил функцию в свой кусок. Вызов функции отлично работает в цикле в случае одного (кусок под названием «работает»), в этом случае за функцией plot_data следует панель. Однако во втором случае функция plot_data() сопровождается тепловой маской, и в этом случае тепловая карта, как ни странно, подавляет функцию plot_data. Это происходит независимо от того, вызывается ли функция plot() или print() вокруг функции plot_data.knitr: вызов функции ggplot2 в цикле не отображается, когда сопровождается некоторыми другими функциями построения графика.

Есть ли способ заставить ggplots вести себя с knitr? И как, черт возьми, это вызов функции, подавляющий вывод предыдущего вызова функции?

Следующий код воспроизводит ошибку для меня:

[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

Это длинный снимок, но это 'par (" ask ")' TRUE? –

+1

Внутри каждого фрагмента хранится '<>' (а не что это проблема)? почему бы не установить 'eval = TRUE' в' setup' и не называть его после этого? – mnel

+0

sebastian-c: no par ("ask") оценивается как false. – zzk

ответ

3

Я думаю, что вы задаете много от knitr. Выравнивание базовой графики и графической графики не очень легко и сложно в R. Я не знаю, как это возможно (упаковка латекса graphics), но я думаю, что когда вы вызываете heatmap, он печатается там же участка сетки.

Добавление plot.new перед вызовом базовой графики отлично работает для меня:

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

, это правильный ответ, спасибо! Я забыл о plot.new. – zzk

0

Там есть ошибка в функции я думаю, переменные из расплава выключены. Это сработало для меня:

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,] ) 
} 
Смежные вопросы