From luke at stat.uiowa.edu  Thu Jun 19 17:45:21 2008
From: luke at stat.uiowa.edu (Luke Tierney)
Date: Thu, 19 Jun 2008 10:45:21 -0500 (CDT)
Subject: [Rd] unix.time() scoping problem (PR#11169)
In-Reply-To: <20080414193013.224F4282EF48@mail.pubhealth.ku.dk>
References: <20080414193013.224F4282EF48@mail.pubhealth.ku.dk>
Message-ID: <alpine.DEB.1.00.0806191043020.6574@luke-inspiron>

This is now fixed in R-devel (r 45953).

luke

On Mon, 14 Apr 2008, bill at insightful.com wrote:

> Full_Name: Bill Dunlap
> Version: 2.8.0 Under development (unstable) svn 45325
> OS: Linux
> Submission from: (NULL) (76.28.245.14)
>
>
> It is difficult to write wrapper functions
> for unix.time(expr) because it uses the idiom
>    expr <- substitute(expr)
>    eval(expr, envir=sys.parent())
> to evaluate the input expression.  Here is an
> example of the problem
>    > elapsed.time<-function(...)unix.time(...)[3]
>    > sapply(1:3, function(seconds.arg)elapsed.time(Sys.sleep(seconds.arg)))
>    Error in Sys.sleep(seconds.arg) : object "seconds.arg" not found
>    Timing stopped at: 0.002 0 0.002
>
> I think thatif unix.time(expr) made use of lazy evaluation of
> arguments and used just
>    expr
> at the point where it wanted expr to be evaluated,
> then the evaluation would take place in the right frame.
> If I make the following change
> diff -c /tmp/unix.time.R /tmp/my.unix.time.R
> *** /tmp/unix.time.R    2008-04-14 12:22:39.000000000 -0700
> --- /tmp/my.unix.time.R 2008-04-14 12:22:32.000000000 -0700
> ***************
> *** 10,23 ****
>      }
>      if (!exists("proc.time"))
>          return(rep(NA_real_, 5))
> -     loc.frame <- parent.frame()
>      if (gcFirst)
>          gc(FALSE)
> -     expr <- substitute(expr)
>      time <- proc.time()
>      on.exit(cat("Timing stopped at:", ppt(proc.time() - time),
>          "\n"))
> !     eval(expr, envir = loc.frame)
>      new.time <- proc.time()
>      on.exit()
>      structure(new.time - time, class = "proc_time")
> --- 10,21 ----
>      }
>      if (!exists("proc.time"))
>          return(rep(NA_real_, 5))
>      if (gcFirst)
>          gc(FALSE)
>      time <- proc.time()
>      on.exit(cat("Timing stopped at:", ppt(proc.time() - time),
>          "\n"))
> !     expr # evaluate in its original frame by lazy evaluation
>      new.time <- proc.time()
>      on.exit()
>      structure(new.time - time, class = "proc_time")
>
> then my wrapper function works as expected:
>> sapply(1:3, function(seconds.arg)elapsed.time(Sys.sleep(seconds.arg)))
> elapsed elapsed elapsed
>  1.001   2.001   3.001
>
> Another approach would be to find the environment that expr
> came from and feed that into eval().  Is there a way to get
> the environment that an unevaluated argument was created in?
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>

-- 
Luke Tierney
Chair, Statistics and Actuarial Science
Ralph E. Wareham Professor of Mathematical Sciences
University of Iowa                  Phone:             319-335-3386
Department of Statistics and        Fax:               319-335-3017
    Actuarial Science
241 Schaeffer Hall                  email:      luke at stat.uiowa.edu
Iowa City, IA 52242                 WWW:  http://www.stat.uiowa.edu



[Rd] unix.time() scoping problem (PR#11169)
Luke Tierney