как вы перебираете глобальную переменную в Sweave - PullRequest
4 голосов
/ 22 апреля 2010

У меня есть большой файл Sweave с переменной "specialty" в верхней части. Остальная часть этого файла - Latex и R, и использует эту переменную.

Как я могу зациклить различные значения для "специальности"?

Две возможности:

  1. Сделать файл одним большим циклом (и преобразовать латексные части в R).
  2. Напишите скрипт, который копирует файл Sweave, заменит значение «specialty» и запускает Sweave для каждой копии.

Можете ли вы прокомментировать эти идеи или предложить лучшие?

Ответы [ 4 ]

5 голосов
/ 23 апреля 2010

Вот некоторая информация, которая может оказаться полезной для новичков в пивоварении.

(сегодня я узнал о пивоварении и использовал его для создания книжного документа с главой для каждой "специальности").

Полезна ссылка Шейна.Другая ссылка Brew .Здесь есть файлы для загрузки и краткое справочное руководство (семь страниц).

По крайней мере, один вариант, варево лучше, чем Sweave:

  • В brew теги более простые, являются вариациямииз <% ...%>.
  • В Sweave тегами являются << ... >> = ... @ и \ Sexpr {...}.

Если вы хотите попробовать brew, выполните следующие действия в R:

install.packages("brew")
library(brew)

Сохраните следующий код brew в файле с именем book.brew.Код печатает несколько цифр числа пи, по одной цифре на главу.Обратите внимание, что есть один цикл, и что его части находятся в латексе, а некоторые - в тегах brew.

   \documentclass{book}
    \title{A book}
    \begin{document}
    \maketitle
    <%# This comment will not appear in the Latex file. %>
    <%
    digits = c(3, 1, 4, 1, 5, 9)
    for (i in 1:length(digits))
    {
    %>
    \chapter{Digit $<%= i %>$}
    Digit $<%= i %>$ of $\pi$ is $<%= digits[i] %>$.
    <%
    }
    %>
    \end{document}

Примечание: при сохранении файла сделайте последнюю строку пустой строкой, или brew выдаст вам предупреждение о незаконченной строке.

В R введите

brew("/your/path/to/book.brew", "/where/you/want/brew/to/create/book.tex")

Скомпилируйте латексный файл book.tex.

5 голосов
/ 22 апреля 2010

Не могли бы вы в конце указать, как должен выглядеть ваш документ? Очевидно, что в нем есть повторяющиеся структуры. В этом случае Sweave не может быть лучшим инструментом. Вместо этого вы можете захотеть использовать что-то вроде brew. См. этот пост в блоге Learning R для примера того, как это работает.

2 голосов
/ 22 апреля 2010

Я уже делал это раньше, используя ваш второй вариант. У меня был отдельный R-файл, который перебирал бы имена групп, назначал каждое из них переменной группы (ваша specialty), создавал переименованную копию мастер-файла Sweave (с именем группы, вставленным в имя файла), а затем Sweave этот новый файл. Ваше использование слова «заменить» вызывает у меня нерешительность - я бы не стал использовать какое-либо решение для регулярных выражений (и, возможно, это не то, что вы намеревались). Просто назначьте его в мастер-сценарии (specialty <- specialties[i]).

Этот код захвачен на моем текущем мертвом домашнем ПК, но я мог бы где-то его использовать на флэш-накопителе. Если у вас возникли проблемы с налаживанием этой работы, дайте мне знать, и я покопаюсь в этом.

brew, вероятно, также стоит посмотреть, хотя у меня пока нет с ним личного опыта, и поэтому я не могу сравнить его со Sweave.

0 голосов
/ 07 ноября 2011

Есть решение, которое позволяет вам оставаться в Sweave, не используя Brew. Ключ заключается в том, чтобы превратить код, применяемый в цикле, в макрос Latex с \newcommand, а затем получить блок R, который перебирает вашу переменную и генерирует вызов вашего макроса Latex для каждого значения

Полный пример доступен на https://stat.ethz.ch/pipermail/r-help/2008-June/164783.html,, но вот суть этого:

\documentclass{article}
\SweaveOpts{echo=FALSE}
\newcommand\digit[2]{%
  \section{Digit #1}
  Digit #1 of $\pi$ is $#2$.
}
\title{Digits of $\pi$}
\begin{document}
\maketitle
<<results=tex>>=
digits = c(3, 1, 4, 1, 5, 9)
for (i in seq(digits)) {
  cat(paste("\\digit{", i, "}{", digits[i], "}\n", sep=""))
}
@ 
\end{document}
...