4

我有一个大的 Sweave 文件,顶部附近有一个名为“specialty”的变量。该文件的其余部分是 Latex 和 R,并使用此变量。

如何遍历“专业”的各种值?

两种可能性是:

  1. 使文件成为一个大循环(并将 Latex 部分转换为 R)。
  2. 编写一个复制 Sweave 文件的脚本,替换“specialty”的值,并在每个副本上运行 Sweave。

你能评论这些想法,或者提出更好的建议吗?

4

4 回答 4

6

这里有一些信息可能对刚接触酿造的人有所帮助。

(我今天学习了 brew 并用它来创建一个书籍文档,每个“专业”都有一个章节。)

Shane 的链接很有帮助。另一个链接是Brew。这有下载和简短的参考手册(七页)。

至少在一个方面,brew 比 Sweave 更好:

  • 在 brew 中,标签更简单,是 <%...%> 的变体。
  • 在 Sweave 中,标签是 <<...>>=...@ 和 \Sexpr{...}。

如果您想尝试 brew,请在 R 中执行以下操作:

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

将以下 brew 代码保存在一个名为book.brew. 该代码打印了 pi 的一些数字,每章一个数字。请注意,有一个循环,它的一部分在 Latex 中,一部分在 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")

编译 Latex 文件 book.tex。

于 2010-04-22T21:32:33.000 回答
5

你能说明你希望你的文档最终是什么样子吗?很明显,它有重复的结构。在这种情况下,Sweave 可能不是最好的工具。您可能想考虑使用类似brew. 有关其工作原理的示例,请参阅Learning R 博客上的这篇博文。

于 2010-04-21T21:14:22.393 回答
2

我以前做过这个,使用你的第二个选项。我有一个单独的 R 文件,它将遍历组名,将每个分配给组变量(您的specialty),创建 Sweave 主文件的重命名副本(将组名粘贴到文件名中),然后 Sweave 那个新文件. 您对“替换”一词的使用让我犹豫 - 我不会尝试任何类型的正则表达式解决方案(也许这不是您想要的)。只需在主脚本 ( specialty <- specialties[i]) 中分配它就可以了。

该代码被困在我目前死机的家用 PC 上,但我可能将它放在某个闪存驱动器上。如果您无法正常工作,请告诉我,我会四处寻找。

brew可能也值得研究,尽管我还没有任何个人经验,因此无法将其与 Sweave 进行比较。

于 2010-04-21T21:25:34.020 回答
0

有一个解决方案可以让您留在 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}
于 2011-11-07T18:35:20.357 回答