# Why?

## July 13, 2012

### Analysing time course microarray data using Bioconductor: a case study using yeast2 Affymetrix arrays

Filed under: latex, Microarray, Publications, R — Tags: , , — csgillespie @ 2:32 pm

A few years ago I was involved in analysing some time-course microarray data. Our biological collaborators were interested in how we analysed their data, so this lead to a creation of tutorial, which in turn lead to a paper. When we submitted the paper, one the referees “suggested” that we write the paper using Sweave; I had never used Sweave. At the time this was a massive pain and I regularly cursed the name of the anonymous referee.  A few years later, I’ve just updated code (due to a change in Bioconductor) and it was a breeze. A belated thanks to the referee.

In this latest update to the paper I’ve

• moved the paper to github;
• changed from Sweave to knitr;
• used RStudio instead of emacs.

You can find details full details about analysis on the associated github page.

## May 12, 2011

### Makefiles and Sweave

Filed under: Computing, latex, R — Tags: , , , , — csgillespie @ 8:19 pm

A Makefile is a simple text file that controls compilation of a target file. The key benefit of using Makefile is that it uses file time stamps to determine if a particular action is needed. In this post we discuss how to use a simple Makefile that compiles a tex file that contains a number of `\include` statements. The files referred to by the `\include` statements are Sweave files.

Suppose we have a master tex file called `master.tex`. In this file we have:
``` \include chapter1 \include chapter2 \include chapter3 .... ```
where the files `chapter1, chapter2, chapter3` are Sweave files. Ideally, when we compile `master.tex`, we only want to sweave if the time stamp of `chapter1.tex` is older than the time stamp of `chapter1.Rnw`. This conditional compiling is even more important when we have a number of sweave files.

## Meta-rules

To avoid duplication in a Makefile, it’s handy to use meta-rules. These rules specify how to convert from one file format to another. For example,
``` .Rnw.tex:     R CMD Sweave \$< ```
is a meta rule for converting an `Rnw` file to a `tex` file. In the above meta-rule, `\$<` is the filename, i.e. `chapter1.Rnw`. Other helpful meta rules are:
``` .Rnw.R:     R CMD Stangle \$< ```
which is used to convert between `Rnw` and `R` files. We will also have a meta-rule for converting from `.tex` to `.pdf`.

For meta-rules to work, we have to list all the file suffixes that we will convert between. This means we have to include the following line:
``` .SUFFIXES: .tex .pdf .Rnw .R ```

## Files to convert

Suppose we have a master tex file called `master.tex` and a sweave file `chapter1.Rnw`. This means we need to convert from:

• master.tex to master.pdf
• chapter1.Rnw to chapter1.tex
• chapter1.Rnw to chapter1.R

Obviously, we don’t want to write down every file we need – especially if we have more than one sweave file. Instead, we just want to state the master file and the Rnw files. There are a couple of ways of doing this, however, the following way combines flexibility and simplicity. We first define the master and Rnw files:

``` ##Suppose we have three Sweave files with a single master file MAIN = master RNWINCLUDES = chapter1 chapter2 chapter3 ```
Now we add in the relevant file extensions
``` TEX = \$(RNWINCLUDES:=.tex) RFILES = \$(RNWINCLUDES:=.R) RNWFILES = \$(INCLUDES:=.Rnw) ```
In the Makefile, whenever we use the `\$(TEX)` variable, it is automatically expanded to
``` chapter1.tex chapter2.tex chapter3.tex ```
A similar rule applies to `\$(RFILES)` and `\$(RNWFILES)`.

## Conversion rules

We now define the file conversion rules. When we build our pdf file we want to:

• build the tex file from Rnw file only if the Rnw files have changed or if the tex file doesn’t exist.
• build the pdf file from the tex file only if master.tex file has changed or one of the Rnw files has changed, or the pdf file doesn’t exist.

We can accomplish this with the following rule:
``` \$(MAIN).pdf: \$(TEX) \$(MAIN).tex ```
Typically, I also have a dependencies on a graphics directory and a bibtex file
``` \$(MAIN).pdf: \$(TEX) \$(MAIN).tex refs.bib graphics/*.pdf ```
We also have a conversion rule to R files.
``` R: \$(RFILES) ```

## Cleaning up

We also use sweave to clean up after ourselves:
``` clean: rm -fv \$(MAIN).pdf \$(MAIN).tex \$(TEX) \$(RFILES) rm -fv *.aux *.dvi *.log *.toc *.bak *~ *.blg *.bbl *.lot *.lof rm -fv *.nav *.snm *.out *.pyc \#*\# _region_* _tmp.* *.vrb rm -fv Rplots.pdf *.RData ```

## The complete Makefile

In the Makefile below:

• make all – creates master.pdf;
• make clean – deletes all files created as part of the latex and sweave process;
• make R – creates the R files from the Rnw files.

``` .SUFFIXES: .tex .pdf .Rnw .R MAIN = master RNWINCLUDES = chapter1 chapter2 chapter3 TEX = \$(RNWINCLUDES:=.tex) RFILES = \$(RNWINCLUDES:=.R) RNWFILES = \$(INCLUDES:=.Rnw) all: \$(MAIN).pdf     \$(MAIN).pdf: \$(TEX) \$(MAIN).tex R: \$(RFILES) view: all     acroread \$(MAIN).pdf & .Rnw.R:     R CMD Stangle \$< .Rnw.tex:     R CMD Sweave \$< .tex.pdf:     pdflatex \$<     bibtex \$*     pdflatex \$<     pdflatex \$< ```

```clean:     rm -fv \$(MAIN).pdf \$(MAIN).tex \$(TEX) \$(RFILES)     rm -fv *.aux *.dvi *.log *.toc *.bak *~ *.blg *.bbl *.lot *.lof     rm -fv *.nav *.snm *.out *.pyc \#*\# _region_* _tmp.* *.vrb     rm -fv Rplots.pdf *.RData ```

• Jeromy Anglim’s post on Sweave and Make;
• Ross Ihaka’s Makefile on Sweave;
• Instead of using a Makefile, you could also use a shell script;