Как перенести вывод пакета анимации R на кадр проектора?

Как перенести вывод пакета анимации R на кадр проектора?

У меня есть следующий код 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 был в кадре проектора так же, как он отображается на 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 [Chromium/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Фрагменты кода разделяются <<>>=и @. Сохраните файл с .Rnwрасширением (R без веб), например 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файл с pdflatexпомощью RStudioили другого редактора, который поддерживает knitr(например, WinEdt имеет надстройку для этой цели). 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}

Связанный контент