Skip to content
Back to formatted view

Raw Message

Message-ID: <alpine.LFD.2.02.1103231203450.22049@gannet.stats.ox.ac.uk>
Date: 2011-03-23T12:05:01Z
From: Brian Ripley
Subject: Sweave: multiple graphic formats, e.g. win.metafile
In-Reply-To: <36335A466E9D6641BC7260D521A9164A74CED57296@MITEX03N.helios.med.uni-muenchen.de>

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