[Rd] Pb with lapply()

Gabor Grothendieck ggrothendieck at gmail.com
Thu Jan 31 19:33:29 CET 2008


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,  <hpages at fhcrc.org> 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, ...) x at data)
>  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 at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>



More information about the R-devel mailing list