1. R fait du LaTeX
Franck ARNAUD
Groupe d'Utilisateurs de R
Mercredi 8 février 2011
2. R & LaTeX – Principe général
●Intérêt : automatiser des opérations répétitives (cahier de
variantes, simulation, évaluation de modèles)
→ Utile d'interfacer R et LaTeX.
Hors-champ : création automatique de discours
●
Méthode :
●
● Les analyses statistiques sont lancées dans R
● Les résultats sont exportés sous forme de tableaux,
graphiques, et de textes
● LaTeX les compile → PDF
4. R et LaTeX – Schéma d'ensemble
Schéma en trois temps :
●
● R crée les objets individuels (tableaux, graphiques, textes)
Output : fichiers eps, fichiers tex
● R crée le code LaTeX qui agence les objets individuels
Output : fichier(s) tex, qui appelle les précédents
● Puis on compile le code LaTeX
Output : fichier pdf
La cerise sur le gâteau :
●
● R lance la compilation et l'affichage du PDF → pénible une fois
5. R & LateX – Créer un graphique
Export de graphiques au format eps :
●
postscript(file="fig1.eps",horizontal=TRUE,width=8,height=5)
graphe(individu1)
dev.off()
N'hésitez pas à utiliser les possibilités d'agence de graphes :
●
● Simple : par(mrow=c(1,2))
● Plus complexe :
layout(matrix=c(1,1,2,1,1,3,4,5,6),3,3,byrow=TRUE)
6. R & LateX – Créer un tableau
Fonction latex du package MASS
●
Mais ça peut s'écrire à la main, si on veut personnaliser :
●
latextab<-function(tab,file)
{
sink(file)
cat("begin{table}[!htbp]begin{center}")
cat("begin{tabular}{c|",rep("c",ncol(tab)),"}n",sep="")
cat(NULL,colnames(tab),sep=" & ")
cat(" nhline")
fff<-function(x) paste( paste(x,collapse=" & "), "")
cat(apply(cbind(rownames(tab),tab),1,fff),sep="n")
cat("hlinenend{tabular}end{center}end{table}n")
sink()
}
7. R et LaTeX – Exemple de tableau
●Exemple ad hoc :
tab<-matrix(1:8,ncol=4)
colnames(tab)<-paste("Col",1:ncol(tab),sep="")
rownames(tab)<-paste("Ind",1:nrow(tab),sep="")
latextab(tab,file="test.tex")
●Output : le fichier test.tex
begin{table}[!htbp]begin{center}begin{tabular}{c|cccc}
& Col1 & Col2 & Col3 & Col4
hlineInd1 & 1 & 3 & 5 & 7
Ind2 & 2 & 4 & 6 & 8
hline
end{tabular}end{center}end{table}
●On peut ajouter des captions, des labels, etc.
8. R et LaTeX – Adapter du texte (1)
Le message → fichier pattern.txt :
●
L'individu %@IDNOM@% a débuté son activité l'année %@ANDEB@%. Il
liquide sa carrière l'année %@ANFIN@% avec %@NTVAL@% trimestres
validés dont %@NTCOT@% trimestres cotisés. La première année, sa pension
vaut %@NIVPENS@%, ce qui représente %@TXREMPLDERN@% de son
dernier salaire.
Ensuite, on remplace chaque identifiant par une valeur
●
●On peut enrichir avec des comportements particuliers →
écriture totalement automatique de rapports
9. R et LaTeX – Adapter du texte (2)
Transformation du message :
●
transformation<-function(message_init,id_correspondance)
{
message_trans<-message_init
debut<-gregexpr(pattern="%@",message_init)[[1]]
fin<-gregexpr(pattern="@%",message_init)[[1]]
n<-length(debut)
for (i in seq_along(debut))
{
catch<-substr(message_init,debut[i]+2,fin[i]-1)
remplac<-as.character(correspondance[3,catch])
message_trans<-sub(pattern=paste("%@",catch,"@
%",sep=""),rep=remplac,x=message_trans)
}
return(message_trans)
}
Fonction globale :
●
R2LaTeX_text<-function(file_message,id_correspondance,file)
{
message<-readLines(file_message)
sink(file)
cat(transformation(message_init=message,
id_correspondance=id_correspondance))
sink()
}
10. R et LaTeX – Adapter du texte (3)
●La table de correspondance :
correspondance<-read.table(file=stdin(),sep=";",header=TRUE)
IDNOM;SEXE;ANDEB;ANFIN;NTVAL;NTCOT;NIVPENS;TXREMPLDERN;NBENF
Herbert Léonard;H;1965;2005;165;160;1850;60%;NA
Patrick Juvet;H;1972;2008;142;127;1250;65%;2
Wanda Maria Ribeiro Furtado Tavares de
Vasconcelos;F;1982;2018;180;150;1800;50%;5
transformation<-function(message_init,id_correspondance)
●On applique la fonction à un individu :
id_indiv<-3
R2LaTeX_text(file_message="pattern.txt",
id_correspondance=id_indiv,
file=paste("Indiv",id_indiv,"resume.tex",sep=""))
●Output :
L'individu Wanda Maria Ribeiro Furtado Tavares de Vasconcelos a débuté son
activité l'année 1982. Il liquide sa carrière l'année 2018 avec 180 trimestres
validés dont 150 trimestres cotisés. La première année, sa pension vaut 1800,
ce qui représente 50% de son dernier salaire.
11. R & LaTeX – Structure globale
On commence par créer tous les tableaux et graphiques :
●
pps<-function(file) postscript(file=file,horizontal=TRUE,width=8,height=5)
for (i in 1:n_indiv)
{
individu<-get(paste("indiv",i,sep="")
pps(file=paste("fig",i,".eps",sep=""))
graphe(individu)
dev.off()
latextab(tableau(individu),file=paste("tab",i,".tex",sep=""))
}
Puis on insère tout ça dans un fichier global :
●
sink("global.tex")
for (i in 1:n_indiv)
{
cat("section*{Résumé de l'individu ",i,"}n")
cat("includegraphics{fig",i,"}n",sep="")
cat("input{tab",i,"}n",sep="")
cat("clearpagen")
}
sink()
12. R & LaTeX - Final
Le fichier compilé se compose, outre le préambule, de :
begin{document}
input{global.tex}
end{document}
Il n'est pas inutile de dater les fichier de sortie ou les tableaux :
temps<-Sys.time() #class(temps);?format.POSIXct
jour<-format(temps,"%A %d %B %Y")
heure<-format(temps,"%Hh%Mm%Ss")
cat("Tableau créé le",jour,"à",heure)
13. R & LaTeX – Ze cherry on ze cake
● R lance la compilation LaTeX :
● Fichier bat :
set path=C:/Progra~1/MiKTeX~1.9/miktex/bin;C:Progra~1gsgs8.70bin
latex --src -interaction=nonstopmode -include-directory
"F:PretImmoLaTeX" %1.tex
dvips -P pdf "%1.dvi"
gswin32c.exe -sPAPERSIZE=a4 -dSAFER -dBATCH -dNOPAUSE
-sDEVICE=pdfwrite -sOutputFile="%1.pdf" -c save pop -f "%1.ps"
● Exécution du fichier bat : system(command=paste("compil.bat",fichier))
● R ouvre Acrobat Reader :
system(paste("C:/Progra~1/Adobe/Reader~1.0/Reader/AcroRd32.exe
",fichier,".pdf",sep=""),wait=FALSE)
● Difficulté : adapter les chemins à l'installation
14. R & LaTeX – Zi end
Merci de votre attention
Des questions ?