[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