# [R] zero-offset matrices

Martyn Plummer plummer at iarc.fr
Tue Mar 2 15:54:26 CET 1999

```Jonathan Rougier wrote:
>
> Has anyone written subscripting methods for matrices which are indexed
> from zero? i.e. functions such as "[.zoffset" and "[<-.zoffset" which
> would allow, given an appropriate function "zmatrix"
>
> "zmatrix" <- function(...)
> {
>         robj <- matrix(...)
>         class(robj) <- "zoffset"
>         robj
> }
>
> fred <- zmatrix(1:20, 4, 5)
> fred[0, 4]              # would be 17
> fred[3, ] <- NA         # would set the last row to NA

No, but it's not hard.

"[.zoffset" <- function (x, i, j, drop = FALSE)
{
if (!missing(i) && is.numeric(i)) {
if (any(i < 0))
stop("negative subscripts forbidden")
else i <- i + 1
}
if (!missing(j) && is.numeric(j)) {
if (any(j < 0))
stop("negative subscripts forbidden")
else j <- j + 1
}
y <- NextMethod("[", x)
if (is.matrix(y))
class(y) <- "zoffset"
return(y)
}

"[<-.zoffset" <- function (x, i, j, value)
{
if (!missing(i) && is.numeric(i)) {
if (any(i < 0))
stop("negative subscripts forbidden")
else i <- i + 1
}
if (!missing(j) && is.numeric(j)) {
if (any(j < 0))
stop("negative subscripts forbidden")
else j <- j + 1
}
y <- unclass(x)
if (missing(i) && missing(j))
y[, ] <- value
else if (missing(i))
y[, j] <- value
else if (missing(j))
y[i, ] <- value
else y[i, j] <- value
if (is.matrix(y))
class(y) <- class(x)
y
}

You might prefer to call your new class "zmatrix", since this matches the
function that creates it, and you will probably want to define "zvector"
as well.

The idea that subscripts start from 1 in R is pretty fundamental, and you
may be entering a world of pain by messing with it.

YMMV
Martyn
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._

```