That's great. I got it. Million thanks. On 5/28/07, Gabor Grothendieck <[EMAIL PROTECTED]> wrote: > On 5/27/07, ronggui <[EMAIL PROTECTED]> wrote: > > Hi,Gabor Grothendieck, Thanks very much. > > > > On 5/27/07, Gabor Grothendieck <[EMAIL PROTECTED]> 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]> >
-- 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.