Bug 1861 - update() can not find objects
Summary: update() can not find objects
Status: NEW
Alias: None
Product: R
Classification: Unclassified
Component: Models (show other bugs)
Version: old
Hardware: ix86 (32-bit) Windows 32-bit
: P5 normal
Assignee: Jitterbug compatibility account
URL:
Depends on:
Blocks:
 
Reported: 2002-08-01 22:01 UTC by Jitterbug compatibility account
Modified: 2014-07-08 06:55 UTC (History)
2 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Jitterbug compatibility account 2002-08-01 22:01:59 UTC
From: yzhou@arcturusag.com
Full_Name: Yi-Xiong Zhou
Version: 1.5.1
OS: win2000pro
Submission from: (NULL) (64.169.249.42)


Update() can not find objects when it is used in a function, which is in turn
being called by another function. Here is a R script to show the problem:

######## begin of the test script ##########
fun1 <- function() {
   x <- matrix(rnorm(500), 20,25)
   y <- rnorm(20)
   oo <- lm(y~x)
   print("step 1")
   update(oo)
   print("first update success.")
   fun2(oo)
}

fun2 <- function(gg) {
   update(gg)
   print("second update success.")
}

fun1()
########### end of the test script #############

Here is the result of running this script:

[1] "step 1"
[1] "first update success."
Error in eval(expr, envir, enclos) : Object "y" not found

Ideally, update should first search the objects in its environment first, then
its parent's, and grand parent's environments ... Right now, it only searchs its
own environment and the global environment, skipping its parents'. 

Comment 1 Jitterbug compatibility account 2002-08-01 22:26:34 UTC
From: Peter Dalgaard BSA <p.dalgaard@biostat.ku.dk>
yzhou@arcturusag.com writes:

> Full_Name: Yi-Xiong Zhou
> Version: 1.5.1
> OS: win2000pro
> Submission from: (NULL) (64.169.249.42)
> 
> 
> Update() can not find objects when it is used in a function, which is in turn
> being called by another function. Here is a R script to show the problem:
> 
> ######## begin of the test script ##########
> fun1 <- function() {
>    x <- matrix(rnorm(500), 20,25)
>    y <- rnorm(20)
>    oo <- lm(y~x)
>    print("step 1")
>    update(oo)
>    print("first update success.")
>    fun2(oo)
> }
> 
> fun2 <- function(gg) {
>    update(gg)
>    print("second update success.")
> }
> 
> fun1()
> ########### end of the test script #############
> 
> Here is the result of running this script:
> 
> [1] "step 1"
> [1] "first update success."
> Error in eval(expr, envir, enclos) : Object "y" not found
> 
> Ideally, update should first search the objects in its environment first, then
> its parent's, and grand parent's environments ... Right now, it only searchs its
> own environment and the global environment, skipping its parents'. 

No, that's not what you should expect in a language with lexical scoping. 


However, there might still be a bug, since update with a non-missing
formula argument would extract the formula environment from the
formula stored in the lm object, but that doesn't happen if it is
missing. Modifying fun2 to

function(gg) {
   update(gg,formula(gg))
   print("second update success.")
}

or even

function(gg) {
   update(gg,y~x)
   print("second update success.")
}

does allow your example to run, which is somewhat unexpected...

-- 
   O__  ---- Peter Dalgaard             Blegdamsvej 3  
  c/ /'_ --- Dept. of Biostatistics     2200 Cph. N   
 (*) \(*) -- University of Copenhagen   Denmark      Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard@biostat.ku.dk)             FAX: (+45) 35327907
Comment 2 Jitterbug compatibility account 2002-08-01 22:53:31 UTC
From: Yi-Xiong Zhou <yzhou@arcturusag.com>
Thanks Peter. This does work for formula. However, it failed to a function
call. Here is another test script:

################# begin test ###############
fun1 <- function() {
   x <- matrix(rnorm(500), 20,25)
   oo <- fun3(x)
   print("step 1")
   update(oo)
   print("first update success.")
   fun2(oo)
}

fun2 <- function(gg) {
   update(gg)
   print("second update success.")
}

fun3 <- function(aa) {
   oo <- list(x=aa, call=match.call())
   oo
}

fun1()
############### end test ############

The error message is 

[1] "step 1"
[1] "first update success."
Error in fun3(aa = x) : Object "x" not found

Yi-Xiong


-----Original Message-----
From: Peter Dalgaard BSA [mailto:p.dalgaard@biostat.ku.dk]
Sent: Thursday, August 01, 2002 10:27 AM
To: Yi-Xiong Zhou
Cc: r-devel@stat.math.ethz.ch; R-bugs@biostat.ku.dk
Subject: Re: update() can not find objects (PR#1861)


yzhou@arcturusag.com writes:

> Full_Name: Yi-Xiong Zhou
> Version: 1.5.1
> OS: win2000pro
> Submission from: (NULL) (64.169.249.42)
> 
> 
> Update() can not find objects when it is used in a function, which is in
turn
> being called by another function. Here is a R script to show the problem:
> 
> ######## begin of the test script ##########
> fun1 <- function() {
>    x <- matrix(rnorm(500), 20,25)
>    y <- rnorm(20)
>    oo <- lm(y~x)
>    print("step 1")
>    update(oo)
>    print("first update success.")
>    fun2(oo)
> }
> 
> fun2 <- function(gg) {
>    update(gg)
>    print("second update success.")
> }
> 
> fun1()
> ########### end of the test script #############
> 
> Here is the result of running this script:
> 
> [1] "step 1"
> [1] "first update success."
> Error in eval(expr, envir, enclos) : Object "y" not found
> 
> Ideally, update should first search the objects in its environment first,
then
> its parent's, and grand parent's environments ... Right now, it only
searchs its
> own environment and the global environment, skipping its parents'. 

No, that's not what you should expect in a language with lexical scoping. 


However, there might still be a bug, since update with a non-missing
formula argument would extract the formula environment from the
formula stored in the lm object, but that doesn't happen if it is
missing. Modifying fun2 to

function(gg) {
   update(gg,formula(gg))
   print("second update success.")
}

or even

function(gg) {
   update(gg,y~x)
   print("second update success.")
}

does allow your example to run, which is somewhat unexpected...

-- 
   O__  ---- Peter Dalgaard             Blegdamsvej 3  
  c/ /'_ --- Dept. of Biostatistics     2200 Cph. N   
 (*) \(*) -- University of Copenhagen   Denmark      Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard@biostat.ku.dk)             FAX: (+45) 35327907
Comment 3 Jitterbug compatibility account 2002-08-02 00:36:51 UTC
From: Thomas Lumley <tlumley@u.washington.edu>
On Thu, 1 Aug 2002 yzhou@arcturusag.com wrote:
<snip>
> Ideally, update should first search the objects in its environment first, then
> its parent's, and grand parent's environments ... Right now, it only searchs its
> own environment and the global environment, skipping its parents'.
>

No, ideally it should search the objects in the environment where the
model was defined.  There's no guarantee that this is a grandparent, and
grandparents shouldn't be searched otherwise.  It might be tricky to get
this to work.

What isn't clear to me is whether the current environment should be
searched before the environment where the model was defined or afterwards.

	-thomas

Comment 4 Jitterbug compatibility account 2002-08-02 02:13:59 UTC
From: Thomas Lumley <tlumley@u.washington.edu>
On Thu, 1 Aug 2002, Yi-Xiong Zhou wrote:

> Thanks Peter. This does work for formula. However, it failed to a function
> call. Here is another test script:
>
> ################# begin test ###############
> fun1 <- function() {
>    x <- matrix(rnorm(500), 20,25)
>    oo <- fun3(x)
>    print("step 1")
>    update(oo)
>    print("first update success.")
>    fun2(oo)
> }
>
> fun2 <- function(gg) {
>    update(gg)
>    print("second update success.")
> }
>
> fun3 <- function(aa) {
>    oo <- list(x=aa, call=match.call())
>    oo
> }
>
> fun1()
> ############### end test ############
>
> The error message is
>
> [1] "step 1"
> [1] "first update success."
> Error in fun3(aa = x) : Object "x" not found

Yes, but this isn't supposed to work, and can't.

In the first place update() is supposed to work on models, not on
arbitrary objects.

In the second place, the object you are returning contains no information
about where it was created, so it's not possible for update to work out
the correct environment.  In this case the correct environment happens to
be parent.frame(2), but there's no reason why this should be true in
general.


When the object is a model with a formula it does carry information about
where it was defined, so update() can look there.  Your first example
should have worked, and the fact that it didn't is a bug (though arguably
just a wishlist bug).  This new example shouldn't work.


	-thomas


Comment 5 Jitterbug compatibility account 2002-08-02 02:20:13 UTC
From: Yi-Xiong Zhou <yzhou@arcturusag.com>
Could an object carry the information about where it was created? Could that
be on the wish list? 

Yi-Xiong

-----Original Message-----
From: Thomas Lumley [mailto:tlumley@u.washington.edu]
Sent: Thursday, August 01, 2002 2:14 PM
To: Yi-Xiong Zhou
Cc: 'Peter Dalgaard BSA'; r-devel@stat.math.ethz.ch;
R-bugs@biostat.ku.dk
Subject: RE: update() can not find objects (PR#1861)


On Thu, 1 Aug 2002, Yi-Xiong Zhou wrote:

> Thanks Peter. This does work for formula. However, it failed to a function
> call. Here is another test script:
>
> ################# begin test ###############
> fun1 <- function() {
>    x <- matrix(rnorm(500), 20,25)
>    oo <- fun3(x)
>    print("step 1")
>    update(oo)
>    print("first update success.")
>    fun2(oo)
> }
>
> fun2 <- function(gg) {
>    update(gg)
>    print("second update success.")
> }
>
> fun3 <- function(aa) {
>    oo <- list(x=aa, call=match.call())
>    oo
> }
>
> fun1()
> ############### end test ############
>
> The error message is
>
> [1] "step 1"
> [1] "first update success."
> Error in fun3(aa = x) : Object "x" not found

Yes, but this isn't supposed to work, and can't.

In the first place update() is supposed to work on models, not on
arbitrary objects.

In the second place, the object you are returning contains no information
about where it was created, so it's not possible for update to work out
the correct environment.  In this case the correct environment happens to
be parent.frame(2), but there's no reason why this should be true in
general.


When the object is a model with a formula it does carry information about
where it was defined, so update() can look there.  Your first example
should have worked, and the fact that it didn't is a bug (though arguably
just a wishlist bug).  This new example shouldn't work.


	-thomas

Comment 6 Jitterbug compatibility account 2002-08-02 03:01:00 UTC
NOTES:
 The problem is actually deeper than this.

Sometime update() wants to evaluate arguments in the environment where the model
was defined, as here. 

Sometimes it wants to use the current environment, eg this snippet from MASS 
ph.fun <- function(data, i) {
  d <- data
  d$calls <- d$fitted + d$res[i]
  coef(update(fit, data=d))
}

Comment 7 Jitterbug compatibility account 2002-08-02 05:01:23 UTC
Audit (from Jitterbug):
Thu Aug  1 23:00:21 2002	thomas	moved from incoming to Models
Fri Aug  2 00:01:23 2002	thomas	changed notes
Fri Aug  2 00:01:23 2002	thomas	foobar