update() can not find objects (PR#1861)

Yi-Xiong Zhou yzhou@arcturusag.com
Thu, 1 Aug 2002 10:53:31 -0700


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
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._