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
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._