2010-04-21 5 views
4

J'ai un gros fichier Sweave avec une variable appelée "spécialité" en haut. Le reste de ce fichier est Latex et R, et utilise cette variable.comment faire un looping sur une variable globale dans Sweave

Comment faire une boucle sur diverses valeurs pour "spécialité"?

Deux possibilités sont:

  1. rendre le fichier soit une grande boucle (et convertir les parties en latex à R).
  2. Écrivez un script qui copie le fichier Sweave, remplacez la valeur de "spécialité" et exécutez Sweave sur chaque copie.

Pouvez-vous commenter ces idées ou suggérer de meilleures?

Répondre

5

Pourriez-vous indiquer à quoi vous voulez que votre document ressemble à la fin? Clairement, il a des structures répétitives. Dans ce cas, Sweave n'est peut-être pas le meilleur outil. Vous pourriez plutôt envisager d'utiliser quelque chose comme brew. Voir this blog post on the Learning R blog pour un exemple de comment cela fonctionne.

+0

Merci pour la référence à brasser. Je voudrais que les résultats de Sweave soient un format de livre, avec un chapitre pour chaque valeur de «spécialité». –

2

Je l'ai fait exactement avant, en utilisant votre deuxième option. J'avais un fichier R séparé qui parcourait les noms de groupe, assignait chacun à la variable de groupe (votre specialty), créait une copie renommée du fichier principal de Sweave (avec le nom du groupe collé dans le nom de fichier), puis Sweave fichier. Votre utilisation du mot «remplacer» me fait hésiter - je n'essaierais pas n'importe quel type de solution regex (et peut-être que ce n'est pas ce que vous voulez). Il suffit de l'affecter dans le script principal (specialty <- specialties[i]).

Ce code est piégé sur mon ordinateur personnel actuellement mort, mais je peux l'avoir sur un lecteur flash quelque part. Si vous avez du mal à faire fonctionner correctement, faites le moi savoir et je vais creuser pour ça.

brew est probablement aussi intéressant d'examiner, même si je n'ai pas encore d'expérience personnelle et ne peut donc pas le comparer à Sweave.

+0

Nous vous remercions de la référence à l'infusion (comme avec une autre affiche shane), et pour offrir votre code. J'ai écrit un programme Python pour lire le fichier Sweave, remplacer la ligne contenant l'affectation "spécialité" et créer un fichier appelé "batch" avec les commandes Sweave et pdflatex, que je pourrais exécuter sur la ligne de commande. J'utilise bash sur Mac OS 10.6. C'est une bonne idée d'utiliser une affectation dans un script maître R. –

+0

Intéressant - J'ai également utilisé Python pour ramener tous ces fichiers LaTeX à travers pdflatex. C'est rassurant que quelqu'un ait trouvé une solution presque identique. –

+0

Vous devriez empaqueter cela pour que d'autres puissent l'utiliser. :) – Shane

5

Voici quelques informations qui peuvent être utiles aux personnes qui commencent à brasser.

(je l'ai appris aujourd'hui brasser et l'a utilisé pour créer un document de livre, avec un chapitre pour chaque « spécialité ».)

lien de Shane est utile. Un autre lien est Brew. Cela a des téléchargements et un court manuel de référence (sept pages).

Dans au moins un moyen, microbrasserie est plus agréable que Sweave:

  • En infusion, les balises sont plus simples, étant des variations de <% ...%>.
  • Dans Sweave, les étiquettes sont < < ... >> = ... @ et \ Sexpr {...}.

Si vous voulez essayer brew, procédez comme suit dans R:

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

Enregistrez le code suivant brew dans un fichier appelé book.brew. Le code imprime quelques chiffres de pi, avec un chiffre par chapitre. Notez qu'il y a une boucle, et que certaines de ses parties sont en Latex, et certaines parties sont en tags d'infusion.

\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} 

Remarque: lorsque vous enregistrez le fichier, la dernière ligne soit une ligne vide ou infusion vous donnera un avertissement sur une ligne inachevée.

En R, le type

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

Compilez le fichier Latex book.tex.

+0

+1 Beau résumé. Merci d'avoir poursuivi cela. – Shane

0

Il existe une solution qui vous permet de rester dans Sweave sans avoir à utiliser Brew. La clé consiste à transformer le code appliqué dans la boucle en une macro Latex avec \newcommand, puis avoir un segment R qui boucle sur votre variable et émet un appel à votre macro Latex pour chaque valeur

Un exemple complet est disponible à https://stat.ethz.ch/pipermail/r-help/2008-June/164783.html, mais voici l'essentiel de celui-ci:

\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}