# [R] sweave options with variable

Henrik Bengtsson hb at biostat.ucsf.edu
Sun Apr 17 17:58:41 CEST 2011

```[Forgot to cc: the list]

Hi.

On Sun, Apr 17, 2011 at 8:04 AM, Kai Ying <yingk at iastate.edu> wrote:
> thanks,
>   It can work but not as elegant as I expect because it add extra code to
> every chunk of code.
> I have tried the cache for this purpose it works in most case but have a lot
> of other problems so I decided to control it by myself.
> I guess that sweave running R code before tex, so tex variable do not work
> and need find something run before sweave and set the variable,
> but it seems currently no way do that.

You can do exactly this by embedding your Sweave document with RSP markup, e.g.

<% needRun <- TRUE %>

<<eval=<%=needRun%>>>=
someSlowFunction()
@

To compile this into a valid Sweave document/file, you have to append
filename extension *.rsp, e.g. report.Rnw.rsp.  Then compile it as:

library("R.rsp");
rsp("report.Rnw.rsp", postprocess=FALSE);

which outputs a file report.Rnw containing:

<<eval=TRUE>>=
someSlowFunction()
@

If you also want to run Sweave on this and generate a PDF you can do
everything in one go (using the default postprocess=TRUE):

library("R.rsp");
rsp("report.Rnw.rsp");

RSP is a context-independent markup, i.e. it does not care what format
the underlying document has, as long as it is text based.

Hope this helps

/Henrik

> Write my own Sweave driver is too
> hard for me hope in the future someone can refine the sweave driver.
>   best wishes
>
> On Sun, Apr 17, 2011 at 7:30 AM, Duncan Murdoch <murdoch.duncan at gmail.com>wrote:
>
>> On 11-04-17 2:41 AM, Kai Ying wrote:
>>
>>> hello:
>>>    Do any one know how to set sweave option by variable, for example I
>>> want
>>> set some of my selected code chunk with:
>>> <<eval=needRun>>= rather than<<eval=TRUE>>=, so  I can change the action
>>> only in the head by change the variable "needRun" one times.
>>> I have tried use "\Def" and "\newcommand", both do not work, so I suppose
>>> it
>>> is related with R/Sweave its self.
>>> thanks for any good suggestion.
>>>
>>>
>> You can't do that, but you can get a similar effect this way:
>>
>> <<echo=FALSE>>=
>> needRun <- TRUE
>> @
>>
>> ...
>>
>> <<thecode,eval=FALSE>>=
>> someSlowFunction()
>> @
>>
>> <<echo=FALSE>>=
>> if (needRun) {
>> <<thecode>>
>> }
>> @
>>
>> Or you could use cacheSweave or weaver for caching, which may do what you
>> want, or write your own Sweave driver to do exactly what you want.
>>
>> Duncan Murdoch
>>
>
>        [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help