我想使用 knitr 包和块选项在 beamer 中创建动画 fig.show='animate'
图形被叠加而不是替换,类似于 \multiinclude 默认的工作方式。
一个最小的非工作示例是以下(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 图形手册来看,它指出情节的两个来源是 plot.new()
和 grid.newpage()
,但有一个脚注可以看到?recordPlot
。所以我尝试在 points
命令之后放置recordPlot()
(并通过 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
上的循环? 或者其他方法在投影仪/编织机中叠加绘图?如果是,如何修改上面的代码以实现这一目标?
正如图形手册所解释的,仅来自高级绘图命令的绘图(例如 记录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])
}
是的,这看起来像是对资源的严重浪费,"自然"的方式应该是像你一样一个接一个地添加点,而不是打开一个新的绘图并从1
到i
绘制点,但是没有办法检测单个 R 表达式中的低级图形更改。