blob: a55d5451c8c095546c4fbd35faaa6bfcb0a42513 [file] [log] [blame]
% 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
<<echo=FALSE, results=hide>>=
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{}
<<results=hide>>=
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}