The problem of promises not being evaluated in lists has been discussed before.
I think its fixed in the development version of R. See r44139 on Jan 24, 2008 in http://developer.r-project.org/R.svnlog.2007 On Jan 31, 2008 1:26 PM, <[EMAIL PROTECTED]> wrote: > 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 > ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel