[R] update.default evaluating in wrong environment?

Duncan Murdoch murdoch at stats.uwo.ca
Tue Oct 10 22:07:50 CEST 2006


On 10/10/2006 1:32 PM, Martin C. Martin wrote:
> 
> Gabor Grothendieck wrote:
>> As a workaround use evaluate=FALSE argument to update and
>> evaluate it yourself fetching the environment from the innards
>> of the lm structure:
>> 
>> f <- function() {
>>   DF <- data.frame(y = 1:12, x1 = gl(2, 1, 12), x2 = gl(2,6))
>>   lm(y ~ x1, DF)
>> }
>> 
>> f.lm <- f()
>> e <- attr(terms(f.lm), ".Environment")
>> eval(update(f.lm, formula = y ~ x2, evaluate = FALSE), e)
> 
> Thanks, or even just:
> 
> e <- environment(formula(f.lm))
> 
> But this was more of a bug report.  Is update.default wrong?  Should it 
> be changed?  I don't see how evaluating in update's parent environment 
> would ever be better default behavior than the formula's environment.

This is pretty old code:  I think the particular line causing the 
problem you see was put there in 2000, but it was a workalike for code 
that was there already in 1998.  This isn't to say that old code is 
necessarily right, but changing it could have lots of unwanted side 
effects.  It's also likely that whatever was in the mind of whoever 
wrote the original shows up in other places, so tracking things down to 
make a consistent change would be a lot of work.  You'd probably want to 
read the referenced 1992 Statistical Models definition of the expected 
behaviour here pretty closely (and recognize that the 1992 book is about 
S, not R, so we might not want to follow it exactly), etc., etc., etc.

All of which is to say that I wouldn't pick up this bug fix unless I was 
personally bitten by it:  it looks like an awful lot of work.  But there 
are others who may want to tackle it.

Duncan Murdoch

> 
> - Martin
>> 
>> 
>> On 10/10/06, Martin C. Martin <martin at martincmartin.com> wrote:
>>> Hi all,
>>>
>>> update.default, which is the method used to update "lm" objects (among
>>> others), extracts the "call" element from it's first argument, updates
>>> it, then evaluates it in the parent.frame().  Shouldn't it be evaluated
>>> in environment(formula(object)), if that's non-NULL?
>>>
>>> I ask because I call "lm" from within a function, and the data argument
>>> is a local variable of that function.  After that, I can't update the
>>> model any more, since the new lm() call (the one evaled in
>>> parent.frame()) can't find the data.
>>>
>>> Best,
>>> Martin
>>>
>>> ______________________________________________
>>> R-help at stat.math.ethz.ch mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide 
>>> http://www.R-project.org/posting-guide.html
>>> and provide commented, minimal, self-contained, reproducible code.
>>>
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list