In a paper I'm writing using Sweave, I make use of lattice graphics, but don't want to explicitly show (or explain) in the article text the print() wrapper I need in code chunks for the graphs to appear. I can solve this by including each chunk twice, with different options, as in <<ortho-xyplot1-code, keep.source=TRUE, eval=FALSE>>library(nlme) library(lattice) xyplot(distance ~ age|Sex, data=Orthodont, type='b', groups=Subject, pch=15:25, col=palette(), cex=1.3, main="Orthodont data") @ <<ortho-xyplot1,fig=TRUE, include=FALSE, echo=FALSE, width=6, height=6>>library(nlme) library(lattice) print(xyplot(distance ~ age|Sex, data=Orthodont, type='b', groups=Subject, pch=15:25, col=palette(), cex=1.3, main="Orthodont data")) @ but then, if I decide to change the plotting code, I have to make changes in two places. Is there some feature of Sweave or lattice I've missed that would simplify this? Re-use of code chunks doesn't seem to apply here. -Michael -- Michael Friendly Email: friendly AT yorku DOT ca Professor, Psychology Dept. York University Voice: 416 736-5115 x66249 Fax: 416 736-5814 4700 Keele Street Web: http://www.datavis.ca Toronto, ONT M3J 1P3 CANADA
On 15/07/2010 4:51 PM, Michael Friendly wrote:> In a paper I'm writing using Sweave, I make use of lattice graphics, but > don't want to explicitly show (or explain) > in the article text the print() wrapper I need in code chunks for the > graphs to appear. > I can solve this by including each chunk twice, with different options, > as in > > <<ortho-xyplot1-code, keep.source=TRUE, eval=FALSE>>> library(nlme) > library(lattice) > xyplot(distance ~ age|Sex, data=Orthodont, type='b', groups=Subject, > pch=15:25, > col=palette(), cex=1.3, main="Orthodont data") > @ > <<ortho-xyplot1,fig=TRUE, include=FALSE, echo=FALSE, width=6, height=6>>> library(nlme) > library(lattice) > print(xyplot(distance ~ age|Sex, data=Orthodont, type='b', > groups=Subject, pch=15:25, > col=palette(), cex=1.3, main="Orthodont data")) > @ > > but then, if I decide to change the plotting code, I have to make > changes in two places. Is there some > feature of Sweave or lattice I've missed that would simplify this? > Re-use of code chunks doesn't seem > to apply here.If the lattice call is always last in the chunk, I believe this would work as a replacement for the second chunk: <<ortho-xyplot1,fig=TRUE, include=FALSE, echo=FALSE, width=6, height=6>><<ortho-xyplot1-code>> print(.Last.value) @ and then you'll only have to edit the first one. But I haven't tried this, so something might go wrong... Duncan Murdoch
I have wondered about this too. The approach I use isn't pretty but does have a couple of advantages - there is only one set of code to run and I have control over the figure size. The first part of the code below is what is shown in the document (but not run), and the second part actually runs the code and makes the plot. <<no2hist, eval=FALSE>>hist(mydata$no2) <<no2hist1, echo = FALSE, results=hide>>pdf("no2hist.pdf") <<no2hist>> dev.off() @ \begin{figure} \centering \includegraphics[width=0.5\textwidth]{no2hist} \caption{The caption.} \label{fig:hist} \end{figure} I'd be interested to know if there are neater ways of doing this. Regards, David -- View this message in context: http://r.789695.n4.nabble.com/Sweave-infelicities-with-lattice-graphics-tp2290665p2290677.html Sent from the R help mailing list archive at Nabble.com.
Dear Michael, I know this situation from writing vignettes and I usually cheat a bit I redefine the functions along these lines: plotmap <- function (...) print (hyperSpec:::plotmap (...)) (plotmap is a lattice-function for hyperSpec objects) plotmap can tehn be used without the print in the vignettes - this works fine for almost all cases. Only, if you have a structure that one of the redefined functions call another one of them, you get e.g. a pdf with 2 pages. Have a look at the vignettes and particularly the file vignettes.defs of package hyperSpec (https://r-forge.r-project.org/scm/viewvc.php/Vignettes/?root=hyperspec). BTW: I find it polite to mention that some definitions etc. are executed silently and where people can find it. Cheers, Claudia
On Thu, Jul 15, 2010 at 1:51 PM, Michael Friendly <friendly at yorku.ca> wrote:> In a paper I'm writing using Sweave, I make use of lattice graphics, but > don't want to explicitly show (or explain) > in the article text the print() wrapper I need in code chunks for the graphs > to appear. I can solve this by including each chunk twice, with different > options, as in > > <<ortho-xyplot1-code, keep.source=TRUE, eval=FALSE>>> library(nlme) > library(lattice) > xyplot(distance ~ age|Sex, data=Orthodont, type='b', groups=Subject, > pch=15:25, > ? col=palette(), cex=1.3, main="Orthodont data") > @ > <<ortho-xyplot1,fig=TRUE, include=FALSE, echo=FALSE, width=6, height=6>>> library(nlme) > library(lattice) > print(xyplot(distance ~ age|Sex, data=Orthodont, type='b', groups=Subject, > pch=15:25, > ? col=palette(), cex=1.3, main="Orthodont data")) > @ > > but then, if I decide to change the plotting code, I have to make changes in > two places. ?Is there some > feature of Sweave or lattice I've missed that would simplify this? Re-use of > code chunks doesn't seem > to apply here.I usually use this variant of Duncan's suggestion: <<ortho-xyplot1-code, keep.source=TRUE, eval=FALSE>>library(nlme) library(lattice) xyplot(distance ~ age|Sex, data=Orthodont, type='b', groups=Subject, pch=15:25, col=palette(), cex=1.3, main="Orthodont data") @ <<ortho-xyplot1,fig=TRUE, include=FALSE, echo=FALSE, width=6, height=6>>plot(trellis.last.object()) @ -Deepayan