From tplate at blackmesacapital.com  Fri Apr 15 18:03:50 2005
From: tplate at blackmesacapital.com (Tony Plate)
Date: Fri Apr 15 18:04:02 2005
Subject: [Rd] treatment of zero and negative elements in matrix indices
In-Reply-To: <425FE3BD.4010704@blackmesacapital.com>
References: <425FE3BD.4010704@blackmesacapital.com>
Message-ID: <425FE5E6.8090009@blackmesacapital.com>

PS: I'm talking about subsetting matrices using a matrix as an index.

Tony Plate wrote:
> Matrix indexing seems to give rather "variable" results when zeros or 
> negative values are included among the indices (in terms of both error 
> messages and in terms of the number of returned values when there is no 
> error message).
> 
> Is this the intended behavior?
> 
> I couldn't see any comments about zeros or negative values in matrix 
> indices in either ?"[" or Section 3.4.2 "Indexing matrices and arrays" 
> of the "R Language Definition" (Version 2.0.1), or in Section 5.3 "Index 
> arrays" of "An Introduction to R" (Version 2.1.0).
> 
> (It looks like the special treatment of zeros and negative indices is 
> being applied to the vector indices after they are derived by standard 
> indexing arithmetic from the matrix indices -- so zeros and negative 
> values in the matrix indices have no special meaning.  There does seem 
> to be some range checking, but it's not consistent -- sometimes index 
> values that are out of range get through.)
> 
>  > x <- matrix(1:6,ncol=2)
>  > dim(x)
> [1] 3 2
>  > x
>      [,1] [,2]
> [1,]    1    4
> [2,]    2    5
> [3,]    3    6
>  > x[rbind(c(1,1), c(2,2))]
> [1] 1 5
>  > x[rbind(c(1,1), c(2,2), c(0,1))]
> [1] 1 5
>  > x[rbind(c(1,1), c(2,2), c(0,0))]
> Error: only 0's may mix with negative subscripts
>  > x[rbind(c(1,1), c(2,2), c(0,2))]
> [1] 1 5 3
>  > x[rbind(c(1,1), c(2,2), c(0,3))]
> Error: subscript out of bounds
>  > x[rbind(c(1,1), c(2,2), c(1,0))]
> Error: only 0's may mix with negative subscripts
>  > x[rbind(c(1,1), c(2,2), c(2,0))]
> Error: only 0's may mix with negative subscripts
>  > x[rbind(c(1,1), c(2,2), c(3,0))]
> [1] 1 5
>  > x[rbind(c(1,1), c(2,2), c(1,2))]
> [1] 1 5 4
>  > x[rbind(c(1,1), c(2,2), c(-1,2))]
> [1] 1 5 2
>  > x[rbind(c(1,1), c(2,2), c(-2,2))]
> [1] 1 5 1
>  > x[rbind(c(1,1), c(2,2), c(-3,2))]
> [1] 1 5
>  > x[rbind(c(1,1), c(2,2), c(-4,2))]
> Error: only 0's may mix with negative subscripts
>  > x[rbind(c(1,1), c(2,2), c(-1,-1))]
> Error: subscript out of bounds
>  >
>  > # range checks are at least sometimes not applied
>  > x <- matrix(1:6, ncol=3)
>  > dim(x)
> [1] 2 3
>  > x[rbind(c(1,1), c(2,2), c(-3,3))]
> [1] 1 4 1
>  > x[rbind(c(1,1), c(2,2), c(-4,3))]
> [1] 1 4
>  >
> 
> 
>  > version
>          _
> platform i386-pc-mingw32
> arch     i386
> os       mingw32
> system   i386, mingw32
> status
> major    2
> minor    0.1
> year     2004
> month    11
> day      15
> language R
>  >
> 
> (I see the same behavior in R 2.1.0 beta of 2005/04/04)
> 
> -- Tony Plate
> 
> PS: FWIW, S-PLUS 6.2 does something more like one would get when using 
> each row of the index matrix as arguments to a call to "[", except that 
> negative values are not allowed at all (any zero value in a row causes 
> that row to be omitted from the result).
> 
> ______________________________________________
> R-devel@stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>


[Rd] treatment of zero and negative elements in matrix indices
Tony Plate