blob: 8e3c4cae5b5eaade966f523e4c20382fe17106bd [file] [log] [blame]
# File src/library/graphics/R/layout.R
# Part of the R package, https://www.R-project.org
#
# Copyright (C) 1995-2012 The R Core Team
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# A copy of the GNU General Public License is available at
# https://www.R-project.org/Licenses/
## FIXME: Deprecate! - users *can* use paste(.., "cm") themselves!
lcm <- function(x) paste(x, "cm")#-> 3 characters (used in layout!)
layout <-
function(mat, widths = rep.int(1, ncol(mat)),
heights = rep.int(1, nrow(mat)), respect = FALSE)
{
storage.mode(mat) <- "integer"
mat <- as.matrix(mat) # or barf
if(!is.logical(respect)) {
respect <- as.matrix(respect)#or barf
if(!is.matrix(respect) || any(dim(respect) != dim(mat)))
stop("'respect' must be logical or matrix with same dimension as 'mat'")
}
num.figures <- as.integer(max(mat))
## check that each value in 1..n is mentioned
for (i in 1L:num.figures)
if (match(i, mat, nomatch=0L) == 0L)
stop(gettextf("layout matrix must contain at least one reference\nto each of the values {1 ... %d}\n",
num.figures), domain = NA)
dm <- dim(mat)
num.rows <- dm[1L]
num.cols <- dm[2L]
cm.widths <- if (is.character(widths)) grep("cm", widths, fixed = TRUE)
cm.heights <- if (is.character(heights)) grep("cm", heights, fixed = TRUE)
## pad widths/heights with 1's and remove "cm" tags
pad1.rm.cm <- function(v, cm.v, len) {
if ((ll <- length(v)) < len)
v <- c(v, rep.int(1, len-ll))
if (is.character(v)) {
wcm <- v[cm.v]
v[cm.v] <- substring(wcm, 1L, nchar(wcm, type="c") - 3)
v <- chartr(getOption("OutDec"), ".", v)
}
as.numeric(v)
}
widths <- pad1.rm.cm(widths, cm.widths, len = num.cols)
heights <- pad1.rm.cm(heights,cm.heights, len = num.rows)
if (is.matrix(respect)) {
respect.mat <- as.integer(respect)
respect <- 2
} else {# respect: logical |--> 0 or 1
respect.mat <- matrix(0L, num.rows, num.cols)
}
.External.graphics(C_layout,
num.rows, num.cols,
mat,# integer
as.integer(num.figures),
col.widths = widths,
row.heights = heights,
cm.widths,
cm.heights,
respect = as.integer(respect),
respect.mat)
invisible(num.figures)
}
layout.show <- function(n=1)
{
## cheat to make sure that current plot is figure 1
oma.saved <- par("oma")
par(oma=rep.int(0,4))
par(oma=oma.saved)
o.par <- par(mar=rep.int(0,4))
on.exit(par(o.par))
for (i in seq_len(n)) {
plot.new()
box()
text(0.5, 0.5, i)
}
invisible()
}