scoping problems (PR#614)
On Mon, Jul 24, 2000 at 11:51:12PM +0200, kjetilh@umsanet.edu.bo wrote:
I am resubmitting this to r-bugs, since Thomas Lumley indicates that it might be an error: On Wed, 5 Jul 2000, Thomas Lumley wrote:
On Wed, 5 Jul 2000, halvorsen wrote:
Hola! I have the following simple function:
testcar
function(pow){
ob <- glm(Pound~CG+Age+Vage,data=car,weights=No,
subset=No>0,family=quasi(link=power(pow),var=mu^2))
deviance(ob)
}
But trying to run it gives:
testcar(1/2)
Error in power(pow) : Object "pow" not found
'pow' isn't found because quasi() is looking for it in a strange
place.
Normally you would expect this sort of syntax to work, but the family functions do some tricky things to allow you to specify things with or
without quotes and without or without parentheses. I suspect this might count as a bug. In any case, you can fix it by doing eval(substitute(glm(Pound~CG+Age+Vage,data=car,weights=No subset=No>0,
family=quasi(link=power(pow),var=mu^2))))
As an additional note. This probably won't work if the argument to testcar is a variable. A more reliable version is eval(substitute(glm(Pound~CG+Age+Vage,data=car,weights=No subset=No>0, family=quasi(link=power(pow),var=mu^2))),list(pow=pow)) ( I moved the ,list argument from "substitute" to "eval" to get it work.) Kjetil Halvorsen
The problem is with quasi:
quasi
function (link = "identity", variance = "constant")
{
linktemp <- substitute(link)
if (is.expression(linktemp))
linktemp <- eval(linktemp)
if (!is.character(linktemp)) {
linktemp <- deparse(linktemp)
if (linktemp == "link")
linktemp <- eval(link)
}
...
Note that neither of the eval's is what is wanted. At this point
you just want to force the promise, ie evaluate the argument in
the calling environment.
The following piece of code seems to do that:
> quasi
function (link = "identity", variance = "constant")
{
linktemp <- substitute(link)
if ( is.expression(linktemp) || is.call(linktemp) )
linktemp <- link
else if (!is.character(linktemp))
linktemp <- deparse(linktemp)
if( is.character(linktemp) )
stats <- make.link(linktemp)
else
stats <- linktemp
...
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- 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 _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
+-------------------------------------------------------------------------+ | Robert Gentleman phone : (64-9) 3737-599 ext 3946 | | Senior Lecturer fax : (64-9) 3737-018 | | Department of Statistics office : Room 206 Maths/Physics | | University of Auckland email : rgentlem@stat.auckland.ac.nz | +-------------------------------------------------------------------------+ -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- 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 _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._