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'. -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- 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 _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
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 _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
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 inturn> 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 onlysearchs 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 _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
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 -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- 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 _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
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 foundYes, 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 -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- 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 _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
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 foundYes, 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 -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- 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 _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
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 foundYes, 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 -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- 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 _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._