[Rd] Sweave: multiple graphic formats, e.g. win.metafile

Prof Brian Ripley ripley at stats.ox.ac.uk
Wed Mar 23 13:05:01 CET 2011


We are currently in the process of implementing PNG and JPEG for 
2.13.0, and an extensible architecture is planned for 2.14.0.

On Wed, 23 Mar 2011, Meyer, Sebastian wrote:

> Dear R devel,
>
> being constrained to a windows environment at work and having colleagues being accustomed to the Microsoft Office Suite, I was looking for a way to have the RweaveLatex driver for Sweave automatically generating 'win.metafile's in addition to the pdf graphics.
> Without this functionalilty, the generation of emf-graphics is quite laborious, I think:
>
> <<>>=
> plotit <- function () {
>   # code which generates the graphic
> }
> win.metafile("foobar.emf")
> plotit()
> dev.off()
> pdf("foobar.pdf")
> plotit()
> dev.off()
> @
> \includegraphics{foobar}
>
>
> I would like to have something like:
>
> <<foobar, fig=true, pdf=true, emf=true>>
> # code which generates the graphic
> @
>
>
> SweaveHooks are not applicable for this feature. Therefore, I thought it would be best to extend the typical 'RweaveLatex' driver by an option 'emf' - like eps and pdf. So, here is the result of some handicrafts:
>
> RweaveLatexEMF <- function ()
> {
> 	# add option emf (= FALSE) and set default for eps to FALSE
> 	setup <- utils::RweaveLatexSetup
> 	setupsrc <- deparse(setup)
> 	epsline <- grep("eps", setupsrc)
> 	setupsrc[epsline] <- sub("eps = TRUE", "eps = FALSE, emf = FALSE", setupsrc[epsline])
> 	setup <- eval(parse(text=setupsrc))
>
> 	# 'makeRweaveLatexCodeRunner' function
> 	makeruncode <- function(evalFunc=utils::RweaveEvalWithOpt) {
> 		runcode <- utils:::RweaveLatexRuncode
> 		runcodesrc <- deparse(runcode)
> 		epsline1 <- grep("cat(.. eps..)", runcodesrc)
> 		runcodesrc <- append(runcodesrc, "            if (options$emf) cat(\" emf\")", after=epsline1)
> 		epsline2 <- grep("options\\$fig && options\\$eval", runcodesrc)
> 		runcodesrc <- append(runcodesrc,
> 			deparse(quote(
> 				if (options$emf && .Platform$OS.type == "windows") {
> 		            grDevices::win.metafile(file=paste(chunkprefix, "emf", sep="."),
> 					                        width=options$width, height=options$height)
> 		            err <- try({SweaveHooks(options, run=TRUE)
> 		                        eval(chunkexps, envir=.GlobalEnv)})
> 		            grDevices::dev.off()
> 		            if(inherits(err, "try-error")) stop(err)
> 		        }
> 			))
> 		, after=epsline2)
> 		runcode <- eval(parse(text=runcodesrc))
> 	}
> 	runcode <- makeruncode()
>
> 	list(setup = setup, runcode = runcode,
>        writedoc = utils::RweaveLatexWritedoc, finish = utils::RweaveLatexFinish,
>        checkopts = utils::RweaveLatexOptions)
> }
>
>
> This enhanced Sweave driver works for me like a charm, but it is a very poor solution.
> What about allowing for all available grDevices on the current platform - besides the standard eps and pdf devices? The only building block is the section "if (options$fig && options$eval)" in utils:::makeRweaveLatexCodeRunner. The TODO list of Seth Falcon's weaver package also states "For Sweave: multiple graphic formats besides just pdf and eps (perhaps
> as a separate driver?)".
> However, since so many packages depend on the basic Sweave implementation by Fritz Leisch, I don't know if there is an easy route to tackle.
>
> Looking forward to your opinions and pointers.
> Best regards,
>  Sebastian Meyer
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



More information about the R-devel mailing list