[Rd] The default behaviour of a missing entry in an environment

Duncan Murdoch murdoch at stats.uwo.ca
Mon Nov 16 18:26:05 CET 2009

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

More information about the R-devel mailing list