Hi,
A few years ago, class() on a matrix was modified to return
c("matrix",
"array") instead of just "matrix", thus formalizing the fact
that a
matrix is an array. Concretely this change meant that is.array(),
inherits() and is() were finally in agreement:
? ? > is.array(matrix())
? ? [1] TRUE
? ? > inherits(matrix(), "array")? # used to return FALSE
? ? [1] TRUE
? ? > is(matrix(), "array")? # also used to return FALSE
? ? [1] TRUE
Has the same kind of change be considered for raster objects? A raster
object is a matrix, and this is acknowledged by is.matrix() but not by
inherits() or is():
? ? > r <- as.raster(array(runif(60), 5:3))
? ? > is.matrix(r)
? ? [1] TRUE
? ? > inherits(r, "matrix")
? ? [1] FALSE
? ? > is(r, "matrix")
? ? [1] FALSE
This is because class(r) only returns "raster":
? ? > class(r)
? ? [1] "raster"
Also, because of this, 'r' is not considered an array in a consistent
manner either:
? ? > is.array(r)
? ? [1] TRUE
? ? > inherits(r, "array")
? ? [1] FALSE
? ? > is(r, "array")
? ? [1] FALSE
These issues would go away if class(r) was returning c("raster",
"matrix", "array") instead of just "raster":
? ? > class(r) <- c("raster", "matrix",
"array")
? ? > inherits(r, "matrix")
? ? [1] TRUE
? ? > is(r, "matrix")
? ? [1] TRUE
? ? > inherits(r, "array")
? ? [1] TRUE
? ? > is(r, "array")
? ? [1] TRUE
Has this been considered?
I'm aware that this kind of change has the potential to be quite
disruptive because it would break any code around that uses things like
? ? if (class(r) == "raster") ...
instead of
? ? if (is.raster(r)) ...
or
? ? if (inherits(r, "raster")) ...
But consistency is priceless isn't it?
Thanks,
H.
--
Herv? Pag?s
Bioconductor Core Team
hpages.on.github at gmail.com