From p.murrell at auckland.ac.nz  Wed Feb  2 01:46:35 2011
From: p.murrell at auckland.ac.nz (Paul Murrell)
Date: Wed, 02 Feb 2011 13:46:35 +1300
Subject: [Rd] [.raster bug {was "str() on raster objects fails .."}
In-Reply-To: <19783.49835.494142.88222@stat.math.ethz.ch>
References: <AANLkTimycPK-3_mj5OPd0eLauAh41r2-Wkrp7j2jo1sw@mail.gmail.com>
	<19783.49835.494142.88222@stat.math.ethz.ch>
Message-ID: <4D48A96B.9020801@auckland.ac.nz>

Hi

On 1/02/2011 9:22 p.m., Martin Maechler wrote:
>>>>>> Henrik Bengtsson<hb at 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 at 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
paul at stat.auckland.ac.nz
http://www.stat.auckland.ac.nz/~paul/



[Rd] [.raster bug {was "str() on raster objects fails .."}
Paul Murrell