我有以下来自包的 R 代码,它可以生成一个随机数,该随机数会在终端animation
上显示一个接一个地添加生成的随机数。R
library("animation")
brownian.motion():
function(n=10,xlim=c(-20,20),ylim=c(-20,20))
{
x=rnorm(n)
y=rnorm(n)
for (i in seq_len(ani.options("nmax"))) {
dev.hold()
plot(x,y,xlim = xlim,ylim = ylim)
text(x,y)
x=x+rnorm(n)
y=y+rnorm(n)
}
}
我希望此 R 代码的结果出现在 beamer 框架中,就像它显示在R
终端上显示一样。
我尝试使用下面的代码作为我的 MWE,但它不起作用
\documentclass{beamer}
\begin{document}
\begin{frame}
%beginning of R code
library("animation")
brownian.motion():
function(n=10,xlim=c(-20,20),ylim=c(-20,20))
{
x=rnorm(n)
y=rnorm(n)
for (i in seq_len(ani.options("nmax"))) {
dev.hold()
plot(x,y,xlim = xlim,ylim = ylim)
text(x,y)
x=x+rnorm(n)
y=y+rnorm(n)
}
}
% end of R code
\end{frame}
\end{document}
请帮帮我
答案1
我以前没有用过 R。经过试验、浏览手册和询问互联网后,我的结论是:
不要使用
animation
R 包。它很复杂,没有太多附加价值。
相反,为图表设置适当的输出设备,例如pdf(...)
,它会产生矢量图形和多页输出。在Rscript
R 代码上运行后,使用将 PDF 输出嵌入为动画\animategraphics
。
点击运行动画(基于 Blink 的浏览器 [Chrome/Chromium、Opera] 可获得最佳性能):
此外,问题中的原始 R 代码无法运行。这是一个工作示例,添加了一个简单的模型,可以防止粒子越过限制。动画帧被写入文件frames.pdf
在终端中运行:
Rscript brnMotion.R
文件brnMotion.R
:
brownianMotion <-
function(n=10,xlim=c(-20,20),ylim=c(-20,20), steps=50)
{
x=rnorm(n) # random starting position
y=rnorm(n)
for (i in 1:steps) {
plot(x,y,xlim = xlim,ylim = ylim)
text(x,y)
# iterate over particles
for(k in 1:n){
walk=rnorm(2); # random move of particle
x[k]=x[k]+walk[1] # new position
y[k]=y[k]+walk[2]
# simple model (at most two rebounds) that prevents a particle
# from moving past the limits
if(x[k]<xlim[1]) x[k]=2*xlim[1]-x[k]
if(x[k]>xlim[2]) x[k]=2*xlim[2]-x[k]
if(y[k]<ylim[1]) y[k]=2*ylim[1]-y[k]
if(y[k]>ylim[2]) y[k]=2*ylim[2]-y[k]
}
}
}
pdf("frames.pdf") # output device and file name
par(xaxs="i", yaxs="i", pty="s") # square plot region
par(mai=c(0.9,0.9,0.2,0.2)) # plot margins
brownianMotion(n=20, steps=400) # 20 particles, 400 time steps
LaTeX 输入(pdflatex
,lualatex
或xelatex
):
\documentclass[aspectratio=169]{beamer}
\usepackage{animate}
\usepackage{graphicx}
\begin{document}
\begin{frame}{Brownian Motion}
\begin{center}
\animategraphics[width=0.5\linewidth,controls]{25}{frames}{}{}
\end{center}
\end{frame}
\end{document}
答案2
这只是通过编织代码来扩展@Alex 的优秀答案,R
以便pdf
一步创建文件。
R
要继续,请创建一个文件,其中包含嵌入的代码块tex
。代码块由和R
分隔。使用(R no web) 扩展名保存文件,例如<<>>=
@
.Rnw
Daniel.Rnw
,例如。
我选择将动画帧保存为png
文件,因为我想上传gif
。语法png("frames%d.png")
保存了一系列文件,称为frame1.png
通过frame100.png
。动画幻灯片只是以通常的方式使用\animategraphics
@Alex的包制作的,它将通过文件animate
分层以创建输出。代码被包装在以将图表放到frame1.png
frame100.png
pdf
R
\begin{frame} \end{frame}
beamer
幻灯片上。
使用或其他支持的编辑器编译.Rnw
文件(例如 WinEdt 有一个用于此目的的插件)。 将执行代码以生成一个文件,该文件将运行代码的输出与代码集成在一起。pdflatex
RStudio
knitr
RStudio
R
.tex
R
LaTeX
\documentclass{beamer}
\usepackage{animate}
\begin{document}
\begin{frame}
%beginning of R code
<<code,echo=FALSE,warning=FALSE,results='hide'>>=
brownianMotion <-
function(n=10,xlim=c(-20,20),ylim=c(-20,20), steps=50)
{
x=rnorm(n)
y=rnorm(n)
for (i in 1:steps) {
plot(x,y,xlim = xlim,ylim = ylim)
text(x,y)
# iterate over particles
for(k in 1:n){
walk=rnorm(2); # random move of particle
x[k]=x[k]+walk[1] # new position
y[k]=y[k]+walk[2]
# simple model for preventing a particle from moving past the limits
if(x[k]<xlim[1]) x[k]=xlim[1]
if(x[k]>xlim[2]) x[k]=xlim[2]
if(y[k]<ylim[1]) y[k]=ylim[1]
if(y[k]>ylim[2]) y[k]=ylim[2]
}
}
}
png("frames%d.png") # output device and file name
par(xaxs="i", yaxs="i", pty="s") # square plot region
par(mai=c(0.9,0.9,0.2,0.2)) # plot margins
brownianMotion(n=20, steps=100) # 20 particles, 100 time steps
dev.off()
@
% end of R code
\begin{center}
\animategraphics[autoplay,controls,palindrome,height=0.7\textheight]{5}{frames}{1}{100}%
\end{center}
\end{frame}
\end{document}
答案3
我不知道“R”,但是当我在线尝试时,您的代码(对于 r)导致了一些错误。这网站提供了一个示例 r 代码。我编译它以获取 png 文件作为输出。我命名它r.png
并使用以下 LaTeX 代码将该图像添加到我的演示文稿中。如果您想了解有关如何在 LaTeX 中添加图像的更多信息,请阅读graphicx
文档。请参阅下面的示例。
\documentclass{beamer}
\usepackage{graphicx}
\begin{document}
\begin{frame}{A graph}
\centering
\includegraphics[height=6cm,width=\textwidth]{r} % In the {} use the appropriate file name. (case-sensitive)
\end{frame}
\end{document}