Hello everyone,
Considering the following code sample :
----
indexes <- function(vec) {
vec <- which(vec==TRUE)
return(vec)
}
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.
Is there a simple way to get the result I expect (and the only consistent
one, IMHO) ?
Thanks by advance for your help,
Pierrick Bruneau
http://www.bruneau44.com
[[alternative HTML version deleted]]
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.
This is nice fodder for 'The R Inferno' -- thanks.
As Milan said, 'which' will suffice as the function.
Here is a specialized function that only returns a
list and is only implemented to work with matrices.
It should solve your current dilemma.
applyL <-
function (X, MARGIN, FUN, ...)
{
stopifnot(length(dim(X)) == 2, length(MARGIN) == 1)
FUN <- match.fun(FUN)
ans <- vector("list", dim(X)[MARGIN])
if(MARGIN == 1) {
for(i in seq_along(ans)) {
ans[[i]] <- FUN(X[i,], ...)
}
} else {
for(i in seq_along(ans)) {
ans[[i]] <- FUN(X[,i], ...)
}
}
names(ans) <- dimnames(X)[[MARGIN]]
ans
}
Pat
On 08/03/2013 08:29, Pierrick Bruneau wrote:> Hello everyone,
>
> Considering the following code sample :
>
> ----
> indexes <- function(vec) {
> vec <- which(vec==TRUE)
> return(vec)
> }
> 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.
> Is there a simple way to get the result I expect (and the only consistent
> one, IMHO) ?
>
> 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.
>
--
Patrick Burns
pburns at pburns.seanet.com
twitter: @burnsstat @portfolioprobe
http://www.portfolioprobe.com/blog
http://www.burns-stat.com
(home of:
'Impatient R'
'The R Inferno'
'Tao Te Programming')