[R] Sweave - if \Sexpr{} than \SweaveInput{"my.Rnw"}

Duncan Murdoch murdoch.duncan at gmail.com
Thu Sep 20 20:55:42 CEST 2012


On 20/09/2012 9:05 AM, Duncan Murdoch wrote:
> On 20/09/2012 8:47 AM, Witold E Wolski wrote:
> > Depending on an R computation I would like to include an Sweave documents
> > in the main Sweave document.
> > How can I do it?
> >
> > So I was thinking .... to use Latex features :
> >
> > \newif\ifpaper
> >
> > \ifpaper
> >
> > \SweaveInput{"my1.Rnw"}
> > \else
> >   \SweaveInput{"my2.Rnw"}
> > \fi
> >
> > But how do I set paper to true or false given an \Sexpr ??
> >
> > \papertrue % or
> >
> > \paperfalse
> >
> >
> > Any ideas?
>
> The SweaveInput directives are processed before any expressions are
> evaluated, so you can't do it that way.  You can have Sweave chunks emit
> LaTex code, so this might achieve a similar effect:
>
> <<results=tex>>=
> if ( test ) name <- "my1"
> else name <- "my2"
>
> Sweave( paste0(name, ".Rnw") )
> paste0("\\input{", name, ".tex}")
> @
>
> I've never tried having a Sweave chunk call Sweave(), so there might be
> troubles there, and you might only be able to input .tex files, not Rnw
> files.
>

I was curious, so I tried this.  It's fine to run Sweave in a code 
chunk, but it prints a fair bit by default, so the chunk up above won't 
work exactly as written.  You need to cat() the \input line, and tell 
Sweave not to print anything, or just ignore what it prints.  I think  
this would do it:

<<echo=false, results=tex>>=

if ( test ) name <- "my1"

else name <- "my2"

Sweave( paste0(name, ".Rnw"), quiet=TRUE )

cat( paste0("\\input{", name, ".tex}") )

@


Duncan Murdoch




More information about the R-help mailing list