116 lines
3.8 KiB
Plaintext
116 lines
3.8 KiB
Plaintext
% 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}
|
|
|