Hi, If needed, lapply() tries to convert its first argument into a list before it starts doing something with it:
> lapply function (X, FUN, ...) { FUN <- match.fun(FUN) if (!is.vector(X) || is.object(X)) X <- as.list(X) .Internal(lapply(X, FUN)) } But in practice, things don't always seem to "work" as suggested by this code (at least to the eyes of a naive user). I have defined an "as.list" method for my S4 class "A": > setClass("A", representation(data="list")) [1] "A" > setMethod("as.list", "A", function(x, ...) [EMAIL PROTECTED]) Creating a new generic function for "as.list" in ".GlobalEnv" [1] "as.list" Testing it: > a <- new("A", data=list(8, 2:0)) > as.list(a) [[1]] [1] 8 [[2]] [1] 2 1 0 OK. But lapply() doesn't work on 'a': > lapply(a, typeof) Error in as.vector(x, "list") : cannot type 'S4' coerce to vector I still have to do the 'as.list(a)' part myself for things to work: > lapply(as.list(a), typeof) [[1]] [1] "double" [[2]] [1] "integer" Seems like using force() inside lapply() would solve the problem: lapply2 <- function(X, FUN, ...) { FUN <- match.fun(FUN) if (!is.vector(X) || is.object(X)) X <- force(as.list(X)) .Internal(lapply(X, FUN)) } It works now: > lapply2(a, typeof) [[1]] [1] "double" [[2]] [1] "integer" Cheers, H. ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel