Unexpected behaviour of apply()
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.