The default behaviour of a missing entry in an environment
On 11/16/2009 12:07 PM, Robert Gentleman wrote:
Hi, On Fri, Nov 13, 2009 at 4:55 PM, Duncan Murdoch <murdoch at stats.uwo.ca> wrote:
On 13/11/2009 7:26 PM, Gabor Grothendieck wrote:
On Fri, Nov 13, 2009 at 7:21 PM, Duncan Murdoch <murdoch at stats.uwo.ca> wrote:
On 13/11/2009 6:39 PM, Gabor Grothendieck wrote:
Note that one should use inherits = FALSE argument on get and exists to avoid returning objects from the parent, the parent of the parent, etc.
I disagree. Normally you would want to receive those objects. If you didn't, why didn't you set the parent of the environment to emptyenv() when you created it?
$ does not look into the parent so if you are trying to get those semantics you must use inherits = FALSE.
Whoops, yes. That's another complaint about $ on environments.
That was an intentional choice. AFAIR neither $ nor [[ on environments was not meant to mimic get, but rather to work on the current environment as if it were a hash-like object. One can always get the inherits semantics by simple programming, but under the model you seem to be suggesting, preventing such behavior when you don't own the environments in question is problematic.
Sure, I agree with how you did that; I'm not sure you had any choice at the time (didn't all environments have base as a parent then?). Even now, you do want both inherits=TRUE and inherits=FALSE behaviour in different circumstances, and $ has to pick just one. Probably my wording should have been "That's another gotcha about $ on environments." Duncan Murdoch