
Eu tenho o seguinte código R do animation
pacote que gera um número aleatório que adiciona números aleatórios gerados um após o outro em exibição no R
terminal.
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)
}
}
Quero que o resultado deste código R esteja em um quadro de projetor exatamente como está sendo exibido no R
terminal.
Tentei o código abaixo como meu MWE, mas não funcionou
\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}
Por favor, me ajude
Responder1
Eu não usei R antes. Minha conclusão depois de experimentar, folhear manuais e perguntar na internet:
Não use o
animation
pacote R. É complicado sem muito valor acrescentado.
Em vez disso, defina um dispositivo de saída apropriado para gráficos, como pdf(...)
, que produz gráficos vetoriais e saída de várias páginas. Depois de executar Rscript
o código R, incorpore a saída do PDF como animação com a extensão \animategraphics
.
Clique para executar a animação (navegadores baseados em Blink [Chrome/Chromium, Opera] para melhor desempenho):
Além disso, o código R original da questão não funciona. Aqui está um exemplo prático, com um modelo simples adicionado que evita que as partículas ultrapassem os limites. Os quadros de animação são gravados em arquivoframes.pdf
Execute em um terminal:
Rscript brnMotion.R
Arquivo 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
Entrada LaTeX ( pdflatex
, lualatex
ou 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}
Responder2
Isso apenas estende a excelente resposta de @Alex, tricotando o R
código para que o pdf
arquivo seja criado em uma única etapa.
Para continuar, crie um arquivo com os pedaços de R
código incorporados no tex
arquivo. R
pedaços de código são delimitados por <<>>=
e @
. Salve o arquivo com uma .Rnw
extensão (R sem web), digamos Daniel.Rnw
.
Optei por salvar os quadros de animação como png
arquivos porque queria fazer upload do arquivo gif
. A sintaxe png("frames%d.png")
salva uma sequência de arquivos chamados frame1.png
por meio de frame100.png
. O slide animado é feito da maneira usual usando o pacote \animategraphics
@Alex animate
, que coloca os arquivos em frame1.png
camadas frame100.png
para criar a pdf
saída. O R
código é agrupado \begin{frame} \end{frame}
para colocar os gráficos em um beamer
slide.
Compile o .Rnw
arquivo com pdflatex
um RStudio
ou outro editor que suporte knitr
(por exemplo, o WinEdt possui um add-in para esse fim). RStudio
executará o R
código para produzir um .tex
arquivo, que integra a saída da execução do R
código com o LaTeX
código.
\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}
Responder3
Não sei 'R', mas seu código (para r) resultou em alguns erros quando tentei online.Essesite fornece um exemplo de código R. Eu compilei para obter um arquivo png como saída. Dei um nome a ele r.png
e usei o seguinte código LaTeX para obter essa imagem em minha apresentação. Se você quiser ler mais sobre como adicionar imagens no LaTeX, leia graphicx
a documentação. Veja o exemplo abaixo.
\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}