From maechler@stat.math.ethz.ch  Thu Jan 30 18:14:17 2003
From: maechler@stat.math.ethz.ch (maechler@stat.math.ethz.ch)
Date: Thu Jan 30 18:14:17 2003
Subject: [Rd] empty array indexing with dimnames -> erroneous error (PR#2507)
Message-ID: <200301301714.SAA18101@pubhealth.ku.dk>

This is a bug that will not often trigger, and only happens for arrays
(but not matrices) ending up with 0 dimensions:

The following code also shows two 'buglets' (the first even for
matrix indexing) where "drop = TRUE/FALSE" is not correctly obeyed.
One can argue that since all these arrays have length zero, it
shouldn't matter what dimensions they get.
[But this shouldn't distract from the real bug giving errors
 where it shouldn't!]


##-- this kind of indexing works with matrices (with dimnames):
m <- cbind(x = 1, y = 1:3)
str(m[1,  0])# drops dimension
str(m[1:2,0])# doesn't drop  <<< ? buglet
str(m[1,  0, drop=FALSE])
str(m[1:2,0, drop=FALSE])


## these apply (not too relevant here)
stopifnot(identical(m[1,         0],
                    m[1, integer(0)]))
stopifnot(identical(m[1,         0, drop=FALSE],
                    m[1, integer(0), drop=FALSE]))

###--- but it fails with arrays ---

dn <- list(LETTERS[1:2], letters[1:3], paste("t",1:4,sep=""))
A. <- array(1:24, dim = 2:4) # no dimnames
Ad <- A.; dimnames(Ad) <- dn # with dimnames

## works `ok', if no dimnames --- not always obeying "drop=" --> 2nd buglet!
for(O in list(0, integer(0))) {
  str(A.[1, O, 2 ]) # int(0)
  str(A.[O,-1, O ])# int[0, 1:2, 0]
  str(A.[O, O,2:3])# int[0, 0, 1:2]

  ## with drop = FALSE:
  str(A.[1, O, 2 , drop=FALSE])# int[1, 0, 1]
  str(A.[O,-1, O , drop=FALSE])# int[0, 1:2, 0]
  str(A.[O, O,2:3, drop=FALSE])# int[0, 0, 1:2]
  cat("---\n")
}

##-- identical with `Ad' instead of `A.', i.e., *with* dimnames:
##--> All 6 statements fail :

O <- 0##__for(O in list(0, integer(0))) {

  try(Ad[1, O, 2 ]) # int(0)
  try(Ad[O,-1, O ])# int[0, 1:2, 0]
  try(Ad[O, O,2:3])# int[0, 0, 1:2]

  ## with drop = FALSE:
  try(Ad[1, O, 2 , drop=FALSE])# int[1, 0, 1]
  try(Ad[O,-1, O , drop=FALSE])# int[0, 1:2, 0]
  try(Ad[O, O,2:3, drop=FALSE])# int[0, 0, 1:2]
  cat("---\n")
##__}



[Rd] empty array indexing with dimnames -> erroneous error (PR#2507)
maechler@stat.math.ethz.ch