% File src/library/grid/vignettes/nonfinite.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{Non-finite values}
%\VignettePackage{grid}
\newcommand{\pkg}[1]{{\normalfont\fontseries{b}\selectfont #1}}
\newcommand{\grid}{\pkg{grid}}
\setlength{\parindent}{0in}
\setlength{\parskip}{.1in}
\setlength{\textwidth}{140mm}
\setlength{\oddsidemargin}{10mm}
\title{How \grid{} Responds to Non-Finite Values}
\author{Paul Murrell}

\begin{document}
\maketitle

<<echo=FALSE, results=hide>>=
library(grDevices)
library(grid)
ps.options(pointsize = 12)
options(width = 60)
@

It is possible to include non-finite values, \texttt{NA}, \texttt{NaN}, {\tt
  Inf}, and \texttt{-Inf}, in specifications of locations and sizes in
\grid{} functions.  This document describes how \grid{} responds to
non-finite values in different cases.

\textbf{viewports} {~} \\
Non-finite values are not permitted in the location, size, or
scales of a viewport.  Viewport scales are checked
when a viewport is created.  It is very hard to be certain that
locations and sizes are not non-finite when the viewport is created
so this is only checked
when the viewport is pushed.
Non-finite values result in error messages.

\textbf{lines},
\textbf{segments},
\textbf{rectangles},
\textbf{text},
\textbf{points},
\textbf{circles} {~} \\
For all of these primitives, non-finite values for locations or
sizes result in the corresponding primitive not being drawn.
The following image provides a simple demonstration.  Each primitive
is drawn at seven x-locations, with the fourth location made non-finite
 (as indicated by a grey \texttt{"NA"}).

<<prim1, echo=FALSE, fig=TRUE, results=hide, width=4, height=2, include=FALSE>>=
pushViewport(viewport(layout = grid.layout(1, 2,
                      widths = unit(c(1, 1), c("inches", "null")))))
grid.rect(gp = gpar(col = "grey"))
pushViewport(viewport(layout.pos.col = 1))
grid.text(c("segments", "text", "lines", "rectangles", "circles", "points"),
          x = 1, just = "right", y = c(0.75, 6:2/10), gp = gpar(col = "grey"))
popViewport()
pushViewport(viewport(layout.pos.col = 2))
x <- 1:7/8
x[4] <- NA
grid.lines(x, 0.5)
grid.text(letters[1:5], x, 0.6)
grid.segments(x, 0.7, x, 0.8)
grid.points(x, rep(0.2, 7))
grid.rect(x, 0.4, 0.02, 0.02)
grid.circle(x, 0.3, 0.02)
grid.text("NA", 0.5, 2:8/10, gp = gpar(col = "grey"))
popViewport(2)
@

\vspace{.5in}
\includegraphics{nonfinite-prim1}

\newpage

\textbf{lineTo} {~} \\
A line segment is only drawn if the previous location and the
new location are both not non-finite.

\textbf{polygon} {~} \\
A non-finite value breaks the polygon into two separate polygons.
NOTE that this break happens within the current polygon as specified
by the \texttt{id} argument.  All polygons with the same \texttt{id}
receive the same \texttt{gp} settings.

\textbf{arrows} {~} \\
An arrow head is only drawn if the first or last line segment is
drawn.

The following image demonstrates the behaviour of these primitives
where x- and y-locations are seven equally-spaced locations around
the perimeter of a circle.  In the top-left figure, all locations
are not non-finite.  In each of the other figures, two locations have
been made non-finite (indicated in each case by grey text).

<<prim2, echo=FALSE, fig=TRUE, results=hide, include=FALSE>>=
n <- 7
primtest2 <- function(nas, na) {
    t <- seq(0, 2*pi, length = n+1)[-(n+1)]
    y <- 0.5 + 0.4*sin(t)
    x <- 0.5 + 0.4*cos(t)
    if (any(nas))
        grid.text(paste("NA", (1:n)[nas], sep = ""),
                  x[nas], y[nas], gp = gpar(col = "grey"))
    x[nas] <- na
    y[nas] <- na
    grid.move.to(x[1], y[1])
    for (i in 2:n)
        grid.line.to(x[i], y[i], gp = gpar(lty = "dashed", lwd = 5))
    grid.polygon(x, y, gp = gpar(fill = "grey", col = NULL))
    grid.lines(x, y, arrow = arrow())
}
celltest <- function(r, c, nas, na) {
    pushViewport(viewport(layout.pos.col = c, layout.pos.row = r))
    primtest2(nas, na)
    grid.rect(gp = gpar(col = "grey"))
    popViewport()
}
cellnas <- function(i) {
    temp <- rep(FALSE, n)
    temp[i] <- TRUE
    temp[n - 3 + i] <- TRUE
    temp
}
pushViewport(viewport(layout = grid.layout(2, 2)))
celltest(1, 1, rep(FALSE, n), NA)
celltest(1, 2, cellnas(1), NA)
celltest(2, 1, cellnas(2), NA)
celltest(2, 2, cellnas(3), NA)
popViewport()
@

\vspace{.5in}
\includegraphics{nonfinite-prim2}
\end{document}

