On Fri, Mar 27, 2020 at 11:08 AM Tomas Kalibera <tomas.kalib...@gmail.com> wrote:
> On 3/27/20 4:39 PM, Hervé Pagès wrote: > > Hi Tomas, > > > > On 3/27/20 07:01, Tomas Kalibera wrote: > >> they provide an over-approximation > > > > They can also provide an "under-approximation" (to say the least) e.g. > > on reference objects where the entire substance of the object is > > ignored which makes object.size() completely meaningless in that case: > > > > setRefClass("A", fields=c(stuff="ANY")) > > object.size(new("A", stuff=raw(0))) # 680 bytes > > object.size(new("A", stuff=runif(1e8))) # 680 bytes > > > > Why wouldn't object.size() look at the content of environments? > > Yes, the treatment of environments is not "over-approximative". It has > to be bounded somewhere, you can't traverse all captured environments, > getting to say package namespaces, global environment, code of all > functions, that would be too over-approximating. For environments used > as hash maps that contain data, such as in reference classes, it would > of course be much better to include them, but you can't differentiate > programmatically. In principle the same environment can be used for both > things, say a namespace environment can contain data (not clearly > related to any user-level R object) as well as code. Not mentioning > things like source references and parse data. > > I think the heuristic used in lobstr works well in practice: don't traverse further than the current environment (supplied as an argument so you can override), and don't ever traverse past the global or base environments. Hadley -- http://hadley.nz [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel