R et LaTeX: Sweave avec Rstudio
Sweave, un m?lange de R et du code LATEX, permet de g?n?rer automatiquement un document contenant du code R, les r?sultats de ces codes et des commentaires. Ceci permet un gain de temps tr?s important permettant de g?n?rer des analyses reproductibles en cas d??ventuel changement des donn?es.
Un article sur LaTeX est disponible en suivant ce lien : https://www.sthda.com/articles/articles-19-53+latex.php
Logiciels r?quis
Il faudrait installer R, RStudio et les outils Latex ( http://latex-project.org/ftp.html).
Proc?dure
1- A partir de Rstudio, cr?er un fichier .Rnw en cliquant sur Fichier -> Nouveau -> R Sweave -> ?crire et enregistrez votre document : myfile.Rnw
2- Compiler votre fichier en .pdf
Lors de la compilation le fichier myfile.Rnw est tout d'abord converti en fichier LaTeX myfile.tex
Squelette du fichier *.Rnw
Les codes R sont inclus entre les balises <<>>= et @ qui d?finissent ce que l'on appelle "chunk" :
Code LATEX :
\documentclass[a4paper]{article} \title{Titre de mon document} \author{A Kass} \usepackage[latin1]{inputenc} % Encodage pour ?criture de document en fran?ais \begin{document} %D?but du document \maketitle %Permet la cr?ation d'une page de garde (Autheur, Titre, Date) . . <<>>= VOTRE CODE R ICI @ . . \end{document} %Fin du document
Les options basiques du chunk (morceaux de codes R)
label : nom du chunk
echo : TRUE/FALSE. Affichage des commandes. Si TRUE, le code est affich?. Valeur par d?faut : TRUE.
fig : TRUE/FALSE. Cr?ation d'un figure. Si TRUE, le graphique cr?? par le code est inclus. Valeur par d?faut : FALSE.
eval: TRUE/FALSE. Si FALSE, le morceau de code n'est pas ex?cut?. Valeur par d?faut : TRUE.
results: verbatim/hide/tex. Affichage des r?sultats des commandes. Si verbatim, le r?sultat est affich? comme dans l'environnement R. Si tex, le r?sultat du code est consid?r? comme du Latex et il est inclus comme tel. Si hide, le code est ex?cut? mais le r?sultat est non affich?. Valeur par defaut : verbatim.
prefix:TRUE/FALSE. If TRUE, les figures g?n?r?es et l'output ont le m?me prefix. Valeur par d?faut : TRUE.
prefix.string: prefix des fichiers g?n?r?s. La valeur par d?faut est le nom du fichier .Rnw.
include: TRUE/FALSE. Indique si le r?sultat text ou figure doit ?tre int?gr? automatiquement. Utilisez include=FALSE, si le r?sultat doit appara?tre ? un endroit diff?rent du morceau de code (en pla?ant le r?sulat manuellement).
eps: TRUE/FALSE. G?n?re des figures EPS.
width: Largeur des figures en inch (6).
height:Hauteur des figures en inch (6).
Les options peuvent ?tre configur?es globalement au d?but du fichier (et peuvent ?tre chang?es ailleurs au cas par cas) en utilisant la commande :
\SweaveOpts(option1=value1,option2=value2,...)
Les options width et height correspondent ? la taille du graphique g?n?r? par R. Elles ne correspondent pas ? la taille du graphique inclus dans le document Latex.
Pour changer la taille de la figure incluse dans le Latex, utiliser la commande :
\setkeys{Gin}{width=0.8\textwidth} et changer 0.8 avec une autre valeur.
On peut ?galement changer la taille manuellement en utilisant la commande d'inclusion manuelle: \includegraphics
Exemple 1: Test statistique et graphique
Code LATEX :
\documentclass[a4paper]{article} \title{Sweave Example 1} \author{Alboukadel Kassambara} \begin{document} \SweaveOpts{concordance=TRUE} \maketitle Dans cet exemple, nous allons inclure un exemple du test kuskal wallis et un boxplot analysant le param?tre ozone en fonction du mois: <<>>= data(airquality) kruskal.test(Ozone ~ Month, data = airquality) @ La table contient \Sexpr{nrow(airquality)} lignes et \Sexpr{ncol(airquality)} colonnes. Le test montre que la distribution du param?tre Ozone varie significativement de mois en mois. Enfin, nous incluons le boxplot des donn?es : \begin{center} <<label=figure1, fig=TRUE,echo=FALSE>>= boxplot(Ozone ~ Month, data = airquality) @ \end{center} \end{document}
\Sexpr{} (comme dans l'exemple 1) permet d?ex?cuter du code R dans la documentation.
Resultat-Sweave-example-1
Exemples 2 : Positionnement manuel d'une figure
Dans cet exemple la figure n'est pas positionn?e ? l'endroit du code ex?cut?. Elle est plac?e manuellement, un peu plus bas, dans le document LaTeX.
Code LATEX :
\documentclass[a4paper]{article} \title{Sweave Exemple 2} \begin{document} \SweaveOpts{concordance=TRUE, prefix.string=sthda} \maketitle <<label=histx,fig=TRUE,include=FALSE>>= x<-rnorm(1000) hist(x, col="lightblue", border="darkblue") @ Dans cet exemple la figure n'est pas positionn?e ? l'endroit du code ex?cut?. Elle est plac?e manuellement, un peu plus bas, dans le document Latex. \begin{figure}[h!] \includegraphics[width=5in]{sthda-histx} \caption{Histogram of x.} \label{histogram-x} \end{figure} \end{document}
Lorsqu'on utilise \begin{figure}, la figure commence sur une nouvelle page. Pour ?viter cela, utilisez \begin{figure}[h!]
Cliquez ici pour voir le PDF
Plusieurs graphiques dans un chunk
Il faudrait utiliser pdf() ou postscript () pour les cr?er et puis les ajouter dans le Latex.
Code LATEX :
\begin{center} <<results=tex, echo=FALSE>>= set.seed(672) for(i in 1:4){ file=paste("myfile", i, ".pdf", sep="") pdf(file=file, paper="special", width=6, height=6) plot(rnorm(100)+i) dev.off() cat("\\includegraphics[height=2in, width=2in]{" , file, "}\n", sep="") } @ \end{center}
Rappeler un morceau de code R par son nom
Code LATEXT :
<<a>>= x <- 10 @ <<b>>= x+y @ <<c>>= <<a>> y <- 20 <<b>> @
Les figures
Code LATEX :
\begin{figure} \begin{center} <<label=fig1,fig=TRUE,echo=FALSE>>= hist(rnorm(1000,0,1) @ \end{center} \caption{Scatter Plot with Regression Line} \label{fig:one} \end{figure}
Les tables
Installer le package xtable :
Code R :
install.packages("xtable")
Code LATEX :
<<results=tex>>= library(xtable) x <- rnorm(100) y <- 4 + 3 * x + rnorm(100, 0, 2) lmodel <- lm(y ~ x) lan <- anova(lmodel) xtable(lmodel, caption = "La legende.", label = "tab:coef" ) @
Il est possible de faire reference a la table en utilisant le code :
\ref{tab:coef} dans le code LATEX.
Exemple 3 : R?f?rencement des Tables et Figures dans la documentation
Code LATEX :
\documentclass[a4paper]{article} \begin{document} \SweaveOpts{concordance=TRUE} <<echo=false,results=hide>>= library(lattice) library(xtable) data(cats, package="MASS") @ A linear regression model of heart weight by sex and gender can be fitted in R using the command <<>>= lm1 = lm(Hwt~Bwt*Sex, data=cats) lm1 @ Tests for significance of the coefficients are shown in Table~\ref{tab:coef}, a scatter plot including the regression lines is shown in Figure~\ref{fig:cats}. \SweaveOpts{echo=false} <<results=tex>>= xtable(lm1, caption="Linear regression model for cats data.", label="tab:coef") @ \begin{figure} \centering <<fig=TRUE,width=12,height=6>>= trellis.par.set(col.whitebg()) print(xyplot(Hwt~Bwt|Sex, data=cats, type=c("p", "r"))) @ \caption{The cats data from package MASS.} \label{fig:cats} \end{figure} \begin{center} \end{center} \end{document}
Cliquez ici pour voir le PDF
Extraction du code R ? partir d'un document Latex
La commande suivante permet d'extraire tous les codes R d'un fichier Latex :
Code R :
Stangle("myfile.Rnw")
Un fichier .R est cr??.
Une fonction R pour compiler du Sweave en pdf
Code R :
#usage : ezSweave("sweave-example-4", preview=T) ezSweave<-function(filename, extension='Rnw', preview=TRUE, encoding="ISO-8859-1") { Sweave(paste(filename,".", extension,sep=''), encoding=encoding) library(tools) texi2dvi(paste(filename,".tex",sep=''), pdf=TRUE) if (preview) { system(paste(options('pdfviewer')[[1]],' ',filename,'.pdf',sep='')) } }
Divers
Sweaveinput{AnotherFile.Rnw} : Inclusion d'un autre fichier . Analogue ? la commande Latex \input ou \include
SweaveOpts{keep.source=TRUE} : Permet de garder les commentaires dans le code
SweaveOpts{} : Permet de changer les options par d?faut