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

From: Meyer, Sebastian <Sebastian.Meyer_at_med.uni-muenchen.de>
Date: Wed, 23 Mar 2011 12:07:32 +0100


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 Received on Wed 23 Mar 2011 - 11:39:27 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Wed 23 Mar 2011 - 19:30:37 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.

list of date sections of archive