Hi
On 1/02/2011 9:22 p.m., Martin Maechler wrote:
Henrik Bengtsson<h...@biostat.ucsf.edu>
on Mon, 31 Jan 2011 11:16:59 -0800 writes:
> Hi, str() on raster objects fails for certain dimensions. For
> example:
>> str(as.raster(0, nrow=1, ncol=100)) 'raster' chr [1, 1:100]
> "#000000" "#000000" "#000000" "#000000" ...
>> str(as.raster(0, nrow=1, ncol=101)) Error in `[.raster`(object,
> seq_len(max.len)) : subscript out of bounds
> This seems to do with how str() and "[.raster"() is coded; when
> subsetting as a vector, which str() relies on, "[.raster"()
> still returns a matrix-like object, e.g.
>> img<- as.raster(1:25, max=25, nrow=5, ncol=5);
>> img[1:2]
> [,1] [,2] [,3] [,4] [,5]
> [1,] "#0A0A0A" "#3D3D3D" "#707070" "#A3A3A3" "#D6D6D6"
> [2,] "#141414" "#474747" "#7A7A7A" "#ADADAD" "#E0E0E0"
> compare with:
>> as.matrix(img)[1:2]
> [1] "#0A0A0A" "#3D3D3D"
> The easy but incomplete fix is to do:
> str.raster<- function(object, ...) {
> str(as.matrix(object), ...);
> }
> Other suggestions?
The informal "raster" class is behaving ``illogical''
in the following sense:
> r<- as.raster(0, nrow=1, ncol=11)
> r[seq_along(r)]
Error in `[.raster`(r, seq_along(r)) : subscript out of bounds
or, here equivalently,
> r[1:length(r)]
Error in `[.raster`(r, 1:length(r)) : subscript out of bounds
When classes do behave in such a way, they definitely need their
own str() method.
However, the bug really is in "[.raster":
Currently, r[i] is equivalent to r[i,] which is not at all
matrix-like and its help clearly says that subsetting should
work as for matrices.
A recent thread on R-help/R-devel has mentioned the fact that
"[" methods for matrix-like methods need to use both nargs() and
missing() and that "[.dataframe" has been the example to follow
"forever", IIRC already in S and S-plus as of 20 years ago.
The main motivation for non-standard behaviour here is to make sure that
a subset of a raster object NEVER produces a vector (because the
conversion back to a raster object then produces a single-column raster
and that may be a "surprise"). Thanks for making the code more standard
and robust.
The r[i] case is still tricky. The following behaviour is quite
convenient ...
r[r == "black"] <- "white"
... but the next behaviour is quite jarring (at least in terms of the
raster image that results from it) ...
r2 <- r[1:(nrow(r) + 1)]
So I think there is some justification for further non-standardness to
try to ensure that the subset of a raster image always produces a
sensible image. A simple solution would be just to outlaw r[i] for
raster objects and force the user to write r[i, ] or r[, j], depending
on what they want.
Paul
Thank you, Henrik, for the bug report.
Martin
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
--
Dr Paul Murrell
Department of Statistics
The University of Auckland
Private Bag 92019
Auckland
New Zealand
64 9 3737599 x85392
p...@stat.auckland.ac.nz
http://www.stat.auckland.ac.nz/~paul/
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel