From h.wickham at gmail.com  Mon Apr 22 16:41:12 2013
From: h.wickham at gmail.com (Hadley Wickham)
Date: Mon, 22 Apr 2013 09:41:12 -0500
Subject: [Rd] Converting an environment to a list: mget vs. as.list
In-Reply-To: <0AA945F7-017B-44FB-980E-2F4ABEF358F8@r-project.org>
References: <CABdHhvHF7_94JuUr8NAD+keW31hBynAPhhBcLuZzJ9WiPbVk_Q@mail.gmail.com>
	<0AA945F7-017B-44FB-980E-2F4ABEF358F8@r-project.org>
Message-ID: <CABdHhvHMQHxsjPtmDe6o2cC9fA1eGn4skP6ascZBd=hmtu4Mjw@mail.gmail.com>

> I'd say the more interesting part is that ls() is so "slow" if you use the ambiguous "name" argument instead of the direct "envir" one:
>
>> microbenchmark(ls(env), ls(envir=env), .Internal(ls(env, FALSE)))
> Unit: nanoseconds
>                       expr   min    lq median    uq   max neval
>                    ls(env) 12445 13422  14450 15144 37505   100
>            ls(envir = env)  1741  2020   2331  2643 15574   100
>  .Internal(ls(env, FALSE))   631   730    828   910  4157   100

That is interesting!

> Note that your objects are so small that you cannot distinguish constant cost (e.g. just the method dispatch on as.list) - and that is in fact what causes the difference - not the actual conversion:

That's a good point, but the first example was quite a bit larger, and
hence the impact of S3 dispatch slightly less:

env <- environment(plot)
names <- ls(env)

microbenchmark(
  as.list(env),
  as.list.environment(env),
  mget(names, env))

                     expr min lq median uq max neval
             as.list(env)  42 49     51 53 140   100
 as.list.environment(env)  39 44     46 48 117   100
         mget(names, env)  33 35     37 38  83   100

so mget still wins in that case.

Hadley

--
Chief Scientist, RStudio
http://had.co.nz/



[Rd] Converting an environment to a list: mget vs. as.list
Hadley Wickham