From hpages at fhcrc.org  Thu Jan 31 19:26:31 2008
From: hpages at fhcrc.org (hpages at fhcrc.org)
Date: Thu, 31 Jan 2008 10:26:31 -0800
Subject: [Rd] Pb with lapply()
Message-ID: <1201803991.47a212d790acf@webmail.fhcrc.org>

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.



[Rd] Pb with lapply()
hpages at fhcrc.org