你如何在Sweave中循环遍历全局变量

时间:2010-04-21 20:47:01

标签: r sweave

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

如何循环“特殊”的各种值?

有两种可能性:

  1. 使文件成为一个大循环(并将Latex部分转换为R)。
  2. 编写一个复制Sweave文件的脚本,替换“special”的值,并在每个副本上运行Sweave。
  3. 你能对这些想法发表评论,还是建议更好的想法?

4 个答案:

答案 0 :(得分:5)

您能说出您希望文档最终看起来像什么吗?显然,它有重复的结构。在这种情况下,Sweave可能不是最好的工具。您可能希望考虑使用brew之类的内容。有关其工作原理的示例,请参阅this blog post on the Learning R blog

答案 1 :(得分:5)

以下是一些可能对新手酿造者有所帮助的信息。

(我今天学习了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。

答案 2 :(得分:2)

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

这段代码被困在我当前死机的家用电脑上,但我可能会把它放在某个闪存盘上。如果你无法正常工作,请告诉我,我会去挖掘它。

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

答案 3 :(得分:0)

有一个解决方案可以让你留在Sweave而不必使用Brew。关键是将在循环中应用的代码转换为具有\newcommand的Latex宏,然后使用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}
相关问题