R-alpha: Bug in tapply in the Windows version of September

Martin Maechler Martin Maechler <maechler@stat.math.ethz.ch>
Mon, 8 Dec 1997 12:30:08 +0100

```Dear Muriel,

the current Unix version of R, 0.60,
has the following definition of  tapply(.).

Can you check if it works for your examples?
If not, please send us a complete example (i.e. with input data, we can
regenerate).
Thank you for your report!

tapply <- function (x, INDEX, FUN=NULL, simplify=TRUE, ...)
{
if (is.character(FUN))
FUN <- get(FUN, mode = "function")
if (!is.null(FUN) && mode(FUN) != "function")
stop(paste("'", FUN, "' is not a function",sep=""))
if (!is.list(INDEX)) INDEX <- list(INDEX)
nI <- length(INDEX)
namelist <- vector("list", nI)
extent <- integer(nI)
nx <- length(x)
group <- rep(1, nx)#- to contain the splitting vector
ngroup <- 1
for (i in seq(INDEX)) {
index <- as.factor(INDEX[[i]])
if (length(index) != nx)
stop("arguments must have same length")
namelist[[i]] <- levels(index)#- all of them, yes !
extent[i] <- nlevels(index)
group <- group + ngroup * (codes(index) - 1)
ngroup <- ngroup * nlevels(index)
}
if (is.null(FUN)) return(group)
ans <- lapply(split(x, group), FUN, ...)
if (simplify && all(unlist(lapply(ans, length)) == 1)) {
ansmat <- array(dim=extent, dimnames=namelist)
ans <- unlist(ans, recursive = FALSE)
}
else  {
ansmat <- array(vector("list", prod(extent)),
dim=extent, dimnames=namelist)
}
ansmat[as.numeric(names(ans))] <- ans
ansmat
}

Martin Maechler <maechler@stat.math.ethz.ch>		 <><
Seminar fuer Statistik, SOL G1
ETH (Federal Inst. Technology)	8092 Zurich	 SWITZERLAND
phone: x-41-1-632-3408		fax: ...-1086
http://www.stat.math.ethz.ch/~maechler/
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._

```