Hi David,

Yes, it is - although the SO question was more directed at figuring out why
sapply seemed slower, the question to R-help is more nuanced in "is this
coercion really necessary for data.frames?", and I figured it might take
some more knowledge of R internals / the difference between lists and
data.frames to answer that.

Ie, might we be introducing some weird subtle bug(s) if we called the
*apply functions on an un-coerced data.frame?

-Kevin

On Sat, Jan 5, 2013 at 1:18 PM, David Winsemius <dwinsemius@comcast.net>wrote:

>
> On Jan 5, 2013, at 11:38 AM, Kevin Ushey wrote:
>
>  Hey guys,
>>
>> I noticed something curious in the lapply call. I'll copy+paste the
>> function call here because it's short enough:
>>
>> lapply <- function (X, FUN, ...)
>> {
>>    FUN <- match.fun(FUN)
>>    if (!is.vector(X) || is.object(X))
>>        X <- as.list(X)
>>    .Internal(lapply(X, FUN))
>> }
>>
>> Notice that lapply coerces X to a list if the !is.vector || is.object(X)
>> check passes.
>>
>> Curiously, data.frames fail the test (is.vector(data.frame()) returns
>> FALSE); but it seems that coercion of a data.frame
>> to a list would be unnecessary for the *apply family of functions.
>>
>> Is there a reason why we must coerce data.frames to list for these
>> functions? I thought data.frames were essentially just 'structured lists'?
>>
>> I ask because it is generally quite slow coercing a (large) data.frame to
>> a
>> list, and it seems like this could be avoided for data.frames.
>>
>
> Is this related to this SO question that uses the microbenchmark function
> to illustrate the costs of the (possibly) superfluous coercion?
>
> http://stackoverflow.com/**questions/14169818/why-is-**
> sapply-relatively-slow-when-**querying-attributes-on-**
> variables-in-a-data-fr<http://stackoverflow.com/questions/14169818/why-is-sapply-relatively-slow-when-querying-attributes-on-variables-in-a-data-fr>
>
> --
>
> David Winsemius, MD
> Alameda, CA, USA
>
>

	[[alternative HTML version deleted]]


