[R] eval and parent.frame [was: Error in Design package: dataset not found for options(datadist)]

Charles C. Berry cberry at tajo.ucsd.edu
Fri Apr 18 05:57:31 CEST 2008


On Fri, 18 Apr 2008, Gad Abraham wrote:

> Frank E Harrell Jr wrote:
>> Gad Abraham wrote:
>>> Hi,
>>>
>>> Design isn't strictly an R base package, but maybe someone can explain
>>> the following.
>>>
>>> When lrm is called within a function, it can't find the dataset dd:
>>>
>>> > library(Design)
>>> > age <- rnorm(30, 50, 10)
>>> > cholesterol <- rnorm(30, 200, 25)
>>> > ch <- cut2(cholesterol, g=5, levels.mean=TRUE)
>>> > fit <- function(ch, age)
>>> + {
>>> +    d <- data.frame(ch, age)
>>> +    dd <- datadist(d)
>>> +    options(datadist="dd")
>>> +    lrm(ch ~ age, data=d, x=TRUE, y=TRUE)
>>> + }
>>> > fit(ch, age)
>>> Error in Design(eval(m, sys.parent())) :
>>>    dataset dd not found for options(datadist=)
>>>
>>> It works outside a function:
>>> > d <- data.frame(ch, age)
>>> > dd <- datadist(d)
>>> > options(datadist="dd")
>>> > l <- lrm(ch ~ age, data=d, x=TRUE, y=TRUE)
>>>
>>>
>>> Thanks,
>>> Gad
>>
>> My guess is that you'll need to put dd in the global environment, not in
>> fit's environment.  At any rate it is inefficient to call datadist every
>> time.  Why not call it once for the whole data frame containing all the
>> predictors, at the top of the program?
>
> This is just sample code, in practice the datadist will be different for
> each invocation of the function.
>
> I think it boils down to this behaviour, which I don't understand ---
> although ls can see x in the parent of f2, eval cannot:


That is because (from ?eval):

"Objects to be evaluated can be of types call or expression or name (when 
the name is looked up in the current scope and its binding is 
evaluated)..."

And 'x' is of type name (aka 'symbol').

So eval never gets around to looking in 'p', because it never succeeded in 
looking up 'x' and evaluating its binding in the current scope.

What you probably want is

     b <- evalq( x, envir=p)

HTH,

Chuck

>
> f1 <- function()
> {
>    x <- 3
>    f2()
> }
>
> f2 <- function()
> {
>    p <- parent.frame()
>    a <- ls(envir=p)
>    print(a)
>    b <- eval(x, envir=p)
>    print(b)
> }
>
> > f1()
> [1] "x"
> Error in eval(x, envir = p) : object "x" not found
>
> ?parent.frame says:
> "The parent frame of a function evaluation is the environment in
> which the function was called.  It is not necessarily numbered one
> less than the frame number of the current evaluation, nor is it
> the environment within which the function was defined."
>
> I read this to mean that the parent frame of f2 should be f1.
>
> What's happening here?
>
> -- 
> Gad Abraham
> Dept. CSSE and NICTA
> The University of Melbourne
> Parkville 3010, Victoria, Australia
> email: gabraham at csse.unimelb.edu.au
> web: http://www.csse.unimelb.edu.au/~gabraham
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

Charles C. Berry                            (858) 534-2098
                                             Dept of Family/Preventive Medicine
E mailto:cberry at tajo.ucsd.edu	            UC San Diego
http://famprevmed.ucsd.edu/faculty/cberry/  La Jolla, San Diego 92093-0901



More information about the R-help mailing list