% File src/library/grid/vignettes/saveload.Rnw % Part of the R package, https://www.R-project.org % Copyright 2001-13 Paul Murrell and the R Core Team % Distributed under GPL 2 or later \documentclass[a4paper]{article} %\VignetteIndexEntry{Persistent representations} %\VignettePackage{grid} \newcommand{\code}[1]{\texttt{#1}} \newcommand{\pkg}[1]{{\normalfont\fontseries{b}\selectfont #1}} \newcommand{\grid}{\pkg{grid}} \newcommand{\R}{{\sffamily R}} \setlength{\parindent}{0in} \setlength{\parskip}{.1in} \setlength{\textwidth}{140mm} \setlength{\oddsidemargin}{10mm} \title{Saving and Loading \grid{} Graphics} \author{Paul Murrell} \begin{document} \maketitle <>= library(grDevices) library(grid) ps.options(pointsize = 12) options(width = 60) @ This is a general discussion concerning how you might go about creating (and reusing) persistent representations of \grid{} graphics, and some of the pitfalls in the various options. \subsection*{\R{} code} The way I usually work with graphics is to write \R{} code in a text file and copy-and-paste or \code{source()} it into R. In this case, the persistent representation of the graphics is the raw \R{} code. The representation is fully editable. The representation is persistent across \R{} sessions, but may not be persistent across \R{} versions because the names, argument lists, and/or behaviour of the \grid{} functions may change. The representation can be reloaded into R. Incompatibilities between versions should be handled gracefully by \R{}'s argument-matching, type-checking, and/or version-checking. \subsection*{\grid{} \code{grob}s} The next most flexible way of creating a persistent version of \grid{} graphics is to \code{save()} a \grid{} \code{grob} \ldots <<>>= gt <- textGrob("hi") save(gt, file = "mygridplot") @ The representation is reloadable so you can reproduce an image \ldots{} <>= load("mygridplot") grid.draw(gt) @ And the representation is editable; there is an API for interacting with \grid{} \code{grobs}, including adding new elements, removing elements, editing features of a \code{grob} and so on. See \code{getGrob()}, \code{addGrob()}, \code{removeGrob()}, and \code{editGrob()}. The representation is persistent across \R{} sessions, but is vulnerable to changes in the internal representation of \grid{} \code{grob}s. The advantage of this representation is that it is possible to share and edit graphics produced by someone else, without seeing the code they used to produce it. \subsection*{Device output} A third way of creating a persistent version of \grid{} graphics is to ``save'' it to a persistent device format (e.g., PostScript, PDF, \ldots). It is possible to edit these representations, but hardly convenient. In particular, none of the coordinate systems used in the construction of plots (e.g., axis scales) are available for editing. The representation is persistent regardless of \R{} sessions or versions, but it cannot be reloaded into \R{}. \subsection*{Display lists} This final option is \emph{not} recommended, but it is possible to do so its downsides need to be explained. What you can do is ``save'' an \R{} display list using, for example, \ldots <<>>= grid.grill() temp <- recordPlot() save(temp, file = "mygridplot") @ This representation is not editable\footnote{Well, there's nothing stopping you editing it, but you should take out life insurance first.}, but it can be reloaded and rerun to reproduce the output \ldots <<>>= load("mygridplot") temp @ The representation is persistent across \R{} sessions, but the saved information involves non-public interfaces and structures which may change between \R{} versions. You also have to make sure that \grid{} has been reloaded. Differences between \grid{} and/or \R{} versions may lead to segmentation faults. \end{document}