[R] sapply(NULL, ...) returns a list?!?

Henrik Bengtsson hb at maths.lth.se
Fri Jul 22 09:32:12 CEST 2005


Hi,

I bet this one has be asked before, but doing

  sapply(x, FUN=as.character)

where 'x' is a vector, then the result "should [] be simplified to a
vector" according to ?sapply, correct?  However,

  > x <- 1:10
  > sapply(x, FUN=as.character)
  [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"
  > sapply(x[1], FUN=as.character)
  [1] "1"

But,

  > sapply(x[c()], FUN=as.character)
  list()

or equivalent,

  > sapply(NULL, FUN=as.character)
  list()


Please enlight me if I missed the reason for this.


Looking at the code for sapply(),

> sapply
function (X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)
{
     FUN <- match.fun(FUN)
     answer <- lapply(as.list(X), FUN, ...)
     if (USE.NAMES && is.character(X) && is.null(names(answer)))
         names(answer) <- X
     if (simplify && length(answer) && length(common.len <-
                  unique(unlist(lapply(answer, length)))) == 1) {
         if (common.len == 1)
             unlist(answer, recursive = FALSE)
         else if (common.len > 1)
             array(unlist(answer, recursive = FALSE),
                   dim = c(common.len, length(X)),
                   dimnames = if (!(is.null(n1 <- names(answer[[1]]))
                                  & is.null(n2 <- names(answer))))
                              list(n1, n2))
         else answer
     }
     else answer
}

I see that the above behavior is coded for (because of the "&&
length(answer) &&" statement), but is this wanted?  I would like to get
a vector of length zero, in line with

   if (simplify && length(X) == 0)
     answer <- FUN(X, ...)
   else
     answer <- lapply(as.list(X), FUN, ...)

Cheers

Henrik




More information about the R-help mailing list