2014-03-30 79 views
6

我想使用knitr軟件包和塊選項fig.show='animate'在投影儀中創建動畫,其中數字被覆蓋而不是替換爲\ multiinclude默認情況下的工作方式。使用knitr在投影儀中疊加動畫

一個最小的非工作示例將如下(Rnw文件),我希望每個點都被逐一添加到動畫中的現有圖。

\documentclass{beamer} 
\usepackage{animate} 
\begin{document} 
\begin{frame}[fragile] 
<<fig.show='animate', fig.width=5, fig.height=5, size='tiny', out.width='.8\\linewidth', fig.align='center', echo=FALSE>>= 
x = 1:2 
plot(x,x,type="n") 
for (i in 1:length(x)) { 
    points(x[i],x[i]) 
} 
@ 
\end{frame} 
\end{document} 

從看knitr graphics manual,它規定地塊的兩個來源是plot.new()grid.newpage(),但有一個腳註看到?recordPlot。所以,我試圖把recordPlot()points命令後(並且也通過par(bg=NA)增加一個透明的背景,但這並沒有工作,因爲只有創建一個單一的情節。

的最小工作示例如下

\documentclass{beamer} 
\usepackage{animate} 
\begin{document} 
\begin{frame}[fragile] 
<<fig.show='animate', fig.width=5, fig.height=5, size='tiny', out.width='.8\\linewidth', fig.align='center', echo=FALSE, fig.keep='all'>>= 
x = 1:2 
plot(x,x,type="n") 
for (i in 1:length(x)) { 
    for (j in 1:i) points(x[j],x[j]) 
} 
@ 
\end{frame} 
\end{document} 

但這看起來像是過度殺傷,因爲每個圖都重繪了圖和前面的所有點。

是否有某種方法可以通過j?或以某種其他方式來覆蓋beamer/knitr中的圖塊?如果是,上面的代碼可以是mo嗎?有沒有做到這一點?

+0

嘗試'fig.keep ='all'' – kohske

+0

這是一個很好的建議,我沒有嘗試過。包括'fig.keep ='all''允許我簡化最小工作示例(我已更新),但在非工作示例中,它只提供了兩個圖:一個沒有點,一個包含所有點而不是依次添加每個點的圖序列,因爲R將循環視爲單個表達式。 – jaradniemi

+0

我不需要使用R代碼中的庫(動畫)嗎? – skan

回答

5

正如所解釋的圖形手冊,只記錄了來自高級繪圖命令(例如plot.new())和完整表達式的繪圖。這意味着如果在for循環中有多個低級別繪圖更改,則這些更改將不會逐個記錄,因爲for循環僅在一個 R表達式中。這就是手冊中的圖4所示。

如果要從for循環創建動畫,循環中必須有高級繪圖命令。手冊中的圖7就是這樣一個例子。

你的情況,你必須將plot()呼叫轉移到循環:

x = 1:2 
for (i in 1:length(x)) { 
    plot(x, x, type = "n") 
    points(x[1:i], x[1:i]) 
} 

是的,這看起來像資源的嚴重浪費,與「自然」的方式應當由一個被加點之一就像你所做的那樣,而不是打開一個新的繪圖並從1i繪製點,但是無法檢測單個R表達式內的低級圖形更改。

+0

我希望有人想出了手冊中提出的解決方法。我猜不會。 – jaradniemi