2010-04-21 110 views
4

我有一個大的Sweave文件,其頂部附近有一個名爲「special」的變量。該文件的其餘部分是Latex和R,並使用此變量。你如何遍歷Sweave中的全局變量

如何循環「專業」的各種值?

兩種可能性:

  1. 使文件是一個大循環(和乳膠部分轉換爲R)。
  2. 編寫一個複製Sweave文件的腳本,替換「special」的值,並在每個副本上運行Sweave。

你能評論這些點子嗎?還是建議更好的?

回答

5

你能說出你最終希望你的文檔看起來像什麼嗎?顯然它有重複的結構。在這種情況下,Sweave可能不是最好的工具。你可能會想要考慮使用類似brew的東西。有關如何工作的示例,請參閱this blog post on the Learning R blog

+0

謝謝您參考釀造。我希望Sweave結果成爲一種書籍格式,併爲每個「專業」價值添加一章。 – 2010-04-22 13:46:42

2

我之前已經完成了這個,使用第二個選項。我有一個單獨的R文件,它將遍歷組名,將每個組賦予組變量(您的specialty),創建Sweave主文件的重命名副本(將組的名稱粘貼到文件名中),然後將新的文件。你使用「替換」這個詞讓我猶豫 - 我不會嘗試任何一種正則表達式解決方案(也許這不是你想要的)。只需在主腳本(specialty <- specialties[i])中進行分配即可。

該代碼被困在我目前死亡的家用電腦上,但我可能在閃存驅動器的某處。如果您無法正確使用此功能,請告訴我,我會爲此仔細研究。

brew可能也值得研究,但我還沒有任何個人經驗,因此無法將其與Sweave進行比較。

+0

感謝您參考brew(與另一張海報shane一樣),並提供您的代碼。我編寫了一個Python程序來讀取Sweave文件,替換包含「專業」任務的行,並使用Sweave和pdflatex命令創建一個名爲「批處理」的文件,我可以在命令行上運行這些命令。我在Mac OS 10.6上使用bash。在R主腳本中使用分配是一個好主意。 – 2010-04-22 13:54:28

+0

有趣 - 我還用Python通過pdflatex壓縮所有這些LaTeX文件。有人獨自提出了一個幾乎完全相同的解決方案,這讓人感到放心。 – 2010-04-22 15:02:21

+0

您應該打包,以便其他人可以使用它。 :) – Shane 2010-04-22 15:03:37

5

以下是一些可能對釀造新手有用的信息。

(我關於BREW今天學到的用它來創建一個圖書資料,爲每個「特產」一章。)

Shane的鏈接是有幫助的。另一個鏈接是Brew。這有下載和一個簡短的參考手冊(七頁)。

在至少一種方式,BREW比Sweave更好:

  • 在釀造,標籤是簡單的<%是變化...%>。
  • 在Sweave中,標籤是< < ... >> = ... @和\ Sexpr {...}。

如果你想嘗試釀造,做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") 

編譯乳膠文件book.tex。

+0

+1尼斯總結。感謝你追求這一點。 – Shane 2010-04-23 01:10:07

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}