Skip to content
Back to formatted view

Raw Message

Message-ID: <1362734680.22892.18.camel@milan>
Date: 2013-03-08T09:24:40Z
From: Milan Bouchet-Valat
Subject: Unexpected behaviour of apply()
In-Reply-To: <CAF_q7hWEk8mwrN91cSoDU-bSo=scVTsMdDMb0KO+uvuzm2a9eg@mail.gmail.com>

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.