eval() tends to be able to convince normal functions of where they are
executing, but primitive functions use different methods to get their
evaluation context and aren't as easily fooled. It turns out do.call()
works better on primitive functions, and it will work for "on.exit".
However I wasn't able to get 'sys.on.exit' to work.

add_on_exit <- function(what) {
  do.call("on.exit", list(substitute(what), add=TRUE), envir=parent.frame())
}

bar <- function() {
  on.exit(print("exit 1"))
  eval(quote(on.exit(print("exit 2"), add=TRUE))) #nope
  do.call("on.exit", alist(print("exit 3"), add=TRUE))
  add_on_exit(print("exit 4"))
  cat("sys.on.exit():\n")
  x <- sys.on.exit()
  print(x)
  cat("----- exiting\n")
}

> bar()
[1] "exit 2"
sys.on.exit():
{
    print("exit 1")
    print("exit 3")
    print("exit 4")
}
----- exiting
[1] "exit 1"
[1] "exit 3"
[1] "exit 4"


On Sat, Nov 2, 2013 at 9:24 PM, Henrik Bengtsson <h...@biostat.ucsf.edu> wrote:
> Why does the following eval() call on sys.on.exit() not return what I
> expect/evaluate in the proper environment?
>
> foo <- function() {
>   cat("foo()...\n");
>   on.exit( message("exiting") )
>
>   cat("sys.on.exit():\n")
>   res <- sys.on.exit()
>   print(res)
>
>   cat("eval(sys.on.exit()):\n")
>   expr <- quote(sys.on.exit())
>   print(expr)
>   res <- eval(expr)
>   print(res)
>
>   cat("foo()...done\n")
> }
>
>> foo()
> foo()...
> sys.on.exit():
> message("exiting")
> eval(sys.on.exit()):
> sys.on.exit()
> NULL
> foo()...done
> exiting
>
> Similar problems appear when I try to "record" on.exit() expressions
> via eval().  It appears that the "primitives" on.exit() and
> sys.on.exit() do something rather special.  Is there a solution to
> what I'm trying to do?
>
> The reason why I'm doing this in the first place, is that I'm trying
> to implement onExit(<expr>, where="replace"), onExit(<expr>,
> where="last"), and onExit(<expr>, where="first").
>
> Thanks,
>
> Henrik
>
> ______________________________________________
> R-devel@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to