[R] Question about "evalq"

Gabor Grothendieck ggrothendieck at gmail.com
Mon May 28 05:52:56 CEST 2007


On 5/27/07, ronggui <ronggui.huang at gmail.com> wrote:
> Hi,Gabor Grothendieck, Thanks very much.
>
> On 5/27/07, Gabor Grothendieck <ggrothendieck at gmail.com> wrote:
> > evalq looks like this:
> >
> >    > evalq
> >    function (expr, envir, enclos)
> >    eval.parent(substitute(eval(quote(expr), envir, enclos)))
> >    <environment: namespace:base>
> >
> > so it seems the difference is that
> >
> > - eval(quote(), envir, enclos) evaluates envir and enclos
> >   in the current frame but
> > - evalq evaluates them in the parent.frame.
> >
> > This may be easier to see in the following example:
>
> Yeah, This example make the question easier to understand.
>
> >    x <- "G"
> >    f1 <- function() eval(quote(x), parent.frame())
> >    f2 <- function() evalq(x, parent.frame())
> >    f11 <- function() {
> >         x <- "a"
> >         f1()
> >    }
> >    f22 <- function() {
> >         x <- "b"
> >         f2()
> >    }
> >    f11() # a
> >    f22() # G
> >
> > To avoid this problem pass a variable whose value is
> > to be enclos= rather than an expression to compute it:
>
> --This is a good idea.
> --If "evalq evaluates them in the parent.frame", I expected that if I
> change parent.frame(2) to parent.frame(1), I will get the answer.But I
> can not actually. So what's wrong with my understanding?
>
>    f1 <- function(x,digits=5) lapply(x, f2)
>    f2 <- function(x) {
>       evalq(print(digits), list(x=x), parent.frame(1))
>    }
>    f1(list(x1=1)) ##Error in print(digits) : object "digits" not found


Good point.  Insert a browser statement where the parent.frame
call was and when it stops do a traceback.  That will show you
what the call stack looks like at that point in time.


> f1 <- function(x,digits=5) lapply(x, f2)
> f2 <- function(x) evalq(print(digits), list(x=x), { browser() } )
> f1(list(x1=1)) ##Error in print(digits) : object "digits" not found
Called from: eval(quote(print(digits)), list(x = x), {
    browser()
})
Browse[1]> traceback()
10: print(digits)
9: eval(expr, envir, enclos)
8: eval(quote(print(digits)), list(x = x), browser())
7: eval(expr, envir, enclos)
6: eval(expr, p)
5: eval.parent(substitute(eval(quote(expr), envir, enclos)))
4: evalq(print(digits), list(x = x), browser())
3: FUN(X[[1L]], ...)
2: lapply(x, f2)
1: f1(list(x1 = 1))
Browse[1]>



More information about the R-help mailing list