[Rd] [External] More precise documentation of on.exit() [when leaving function vs. "context"]
peter dalgaard
pd@|gd @end|ng |rom gm@||@com
Sat Feb 15 13:17:11 CET 2025
It would probably be best if we can avoid going the "syntactic sugar" way. It also happens in with():
> with(airquality,{on.exit(print("hi")); print("ho")})
[1] "ho"
[1] "hi"
and I don't see a nice way of recasting that as a function call. So maybe just say something like "on.exit() also works in other evaluations of compound expressions in a separate scope, like local() or with()"?
-pd
> On 15 Feb 2025, at 02.05, luke-tierney--- via R-devel <r-devel using r-project.org> wrote:
>
> On Fri, 14 Feb 2025, Michael Chirico wrote:
>
>> The current documentation of ?on.exit reads [1]
>>
>>> `on.exit` records [`expr`] as needing to be executed when the current function exits...
>>
>> This is almost always how it is used, however I don't see that as
>> explaining this other common way to use on.exit():
>>
>> local({
>> old = setwd(...)
>> on.exit(setwd(old))
>> readLines(...)
>> })
>>
>> There's not really a "function" here. It may be that the actual
>> implementation of 'local()' eventually runs this code
>> indistinguishably from a function, which I'm not sure -- all I see is
>> that local() is a wrapper of eval.parent(), so it doesn't _look_ to me
>> like that's the case.
>
> local(expr) is essentially equivalent to (function() expr)().
>
> ['Essentially' because in the interpreted implementation there might
> currently be slight differences, though if there are we would want to
> eventually get rid of them. For compiled code the two are exactly
> equivalent.]
>
> I don't see any benefits of changing this wording in ?on.exit that
> would outweigh the costs.
>
> In principle I don't object to noting in ?local that local(expr) is
> just syntactic sugar for (function() expr)(), but not until someone
> spends some time making sure it is exactly true for the interpreted
> case; not something I could justify giving high priority to.
>
>> I'm not sure this word has a precise meaning in R but I think of
>> on.exit() as running upon leaving the "context" in this case. Would
>> that be an improvement? Is this more an "unintentional" benefit that
>> local() can be used like this?
>>
>> I've definitely seen usage like this [2] that I've recommended just be
>> re-written with local instead:
>>
>> (\(x) { old = setwd(...); on.exit(setwd(old)); readLines(...) })()
>>
>> I'll also note that while this approach to using on.exit() is not
>> uncommon, and quite a useful idiom, it does not appear in the examples
>> either in ?on.exit or in ?local [3].
>
> I'm not sure I would want to encourage this. Using tryCatch with a
> finally expression seems clearer to me:
>
> local({ old <- setwd(...); tryCatch(readLines(...), finally = setwd(old)) })
>
> Best,
>
> luke
>
>> (I also don't see mention of these in any other R manual [4][5])
>>
>> Mike C
>>
>> [1] https://github.com/r-devel/r-svn/blob/9bd62756d3c1289c3c01faec0e2b4de9e8a88d59/src/library/base/man/on.exit.Rd#L10-L13
>> [2] https://github.com/rstudio/sass/blob/9228fcf39deecfe32b7cb90ed40690338a18acba/scripts/build_docs.R#L5-L23
>> [3] https://github.com/r-devel/r-svn/blob/9bd62756d3c1289c3c01faec0e2b4de9e8a88d59/src/library/base/man/eval.Rd#L136-L138
>> [4] https://github.com/r-devel/r-svn/blob/main/doc/manual/R-intro.texi
>> [5] https://github.com/r-devel/r-svn/blob/9bd62756d3c1289c3c01faec0e2b4de9e8a88d59/doc/manual/R-lang.texi#L3755-L3757
>>
>> ______________________________________________
>> R-devel using r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>
> --
> Luke Tierney
> 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-tierney using uiowa.edu
> Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu/
>
> ______________________________________________
> R-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
--
Peter Dalgaard, Professor,
Center for Statistics, Copenhagen Business SchoolSolbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Office: A 4.23
Email: pd.mes using cbs.dk Priv: PDalgd using gmail.com
More information about the R-devel
mailing list