[Rd] scoping problems (PR#614)
Robert Gentleman
rgentlem@stat.auckland.ac.nz
Tue, 25 Jul 2000 10:21:09 +1200
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
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._