[R] Unexpected behaviour of apply()

Milan Bouchet-Valat nalimilan at club.fr
Fri Mar 8 10:24:40 CET 2013


Le vendredi 08 mars 2013 à 09:29 +0100, Pierrick Bruneau a écrit :
> Hello everyone,
> 
> Considering the following code sample :
> 
> ----
> indexes <- function(vec) {
>     vec <- which(vec==TRUE)
>     return(vec)
> }
This is essentially which(), what did you write such a convoluted
function to get the same result?

> mat <- matrix(FALSE, nrow=10, ncol=10)
> mat[1,3] <- mat[3,1] <- TRUE
> ----
> 
> Issuing apply(mat, 1, indexes) returns a 10-cell list, as expected.
> Now if I do:
> 
> ----
> mat[1,3] <- mat[3,1] <- FALSE
> apply(mat, 1, indexes)
> ----
> 
> I would expect a 10-cell list with integer(0) in each cell - instead I get
> integer(0), which wrecks my further process.
>From ?apply:
     If each call to ‘FUN’ returns a vector of length ‘n’, then ‘apply’
     returns an array of dimension ‘c(n, dim(X)[MARGIN])’ if ‘n > 1’.
     If ‘n’ equals ‘1’, ‘apply’ returns a vector if ‘MARGIN’ has length
     1 and an array of dimension ‘dim(X)[MARGIN]’ otherwise.  If ‘n’ is
     ‘0’, the result has length 0 but not necessarily the ‘correct’
     dimension.

Note especially the last sentence.


> Is there a simple way to get the result I expect (and the only consistent
> one, IMHO) ?
One of the interests of apply() is that it combines the return values
from all function calls into a convenient form, but this can indeed be a
problem if you cannot know in advance what this form will be. If you
need a list in all cases, then just call lapply():
lapply(seq(nrow(mat)), function(i) which(mat[i,]))


Regards

> Thanks by advance for your help,
> 
> Pierrick Bruneau
> http://www.bruneau44.com
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list