
Hi R-devel,

When using lapply upon data.frame, I notice lapply coerces data.frame to list before calling internal lapply function.

R> lapply
function (X, FUN, ...) 
{
    FUN <- match.fun(FUN)
    if (!is.vector(X) || is.object(X)) 
        X <- as.list(X)
    .Internal(lapply(X, FUN))
}

df <- data.frame(V1=seq(100*1024*1024), V2=rnorm(100*1024))

R> is.vector(df)            # btw, list is a vector, data.frame is a list, but data.frame is NOT a vector, something is not consistent ??
[1] FALSE

X <- as.list(X) is executed and takes time for large data.frame
R> object.size(df)
1258291976 bytes
R> system.time(as.list(df))
   user  system elapsed 
  1.396   0.472   1.885 

The question is: Given that data.frame is a list, is it necessary to coerce the data.frame to a list for lapply?

Would the following logic do the same but more efficient for lapply to run on data.frame?

     if (!is.vector(X) && !is.list(X) || is.object(X)) 
        X <- as.list(X)
    .Internal(lapply(X, FUN))

Thanks,

Qin
	[[alternative HTML version deleted]]

