Re: [R] Question about "evalq" Hi,Gabor Grothendieck, Thanks very much. On 5/27/07, Gabor Grothendieck  wrote: > evalq looks like this: > >    > evalq >    function (expr, envir, enclos) >    eval.parent(substitute(eval(quote(expr), envir, enclos))) >     > > 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 >    f1 <- function(x,digits=5) lapply(x, f2) >    f2 <- function(x) { >       pf2 <- parent.frame(2) >       evalq(print(digits), list(x=x), pf2) >    } >    f1(list(x1=1)) # 5 > > > > On 5/26/07, ronggui  wrote: > > The help page of eval says: The 'evalq' form is equivalent to > > 'eval(quote(expr), ...)'.  But the following is not equivalent.  Can > > anyone give me some explaination? Thanks very much. > > > > > f1 <- function(x,digits=5) lapply(x, f2) > > > f2 <- function(x) eval(quote(print(x+1,digits=digits)),list(x=x),parent.frame(2)) > > > f1(list(x1=1)) > > [1] 2 > > $x1 > > [1] 2 > > > > > > > > f1 <- function(x,digits=5) lapply(x, f2) > > > f2 <- function(x) evalq(print(x+1,digits=digits),list(x=x),parent.frame(2)) > > > f1(list(x1=1)) > > Error in print.default(x + 1, digits = digits) : > >  object "digits" not found > > > > > > > > -- > > Ronggui Huang > > Department of Sociology > > Fudan University, Shanghai, China > > > > ______________________________________________ > > R-help@stat.math.ethz.ch 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. > > > --  Ronggui Huang Department of Sociology Fudan University, Shanghai, China ______________________________________________ R-help@stat.math.ethz.ch 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.