[R] How to perform package cleanup when R session is ending?

Bill Dunlap
2020-12-18T17:09:44Z

E.g., as in a package containing just the following R code:

$ cat testFinalizer/R/zzz.R
envir <- new.env()
cleanup <- function(e) {
    message("cleanup(", format(e), ")")
    if (!isTRUE(envir$cleaned)) {
        message("    cleaning ", format(e))
        envir$cleaned <- TRUE
    } else {
        # cleanup previously called by .onUnload()
        message("    ", format(e), " has already been
cleaned")
    }
}
.onLoad <- function(libname, pkgname) {
    message("Loading ", pkgname, " from ", libname)
    reg.finalizer(e=envir, f=cleanup, onexit=TRUE)
    message("Installed finalizer for ", format(envir))
}
.onUnload <- function(libpath) {
    message("Unloading ", libpath)
    cleanup(envir)
}

This gives:

$ R --quiet
> library(testFinalizer,lib="lib")
Loading testFinalizer from /home/bill/packages/lib
Installed finalizer for <environment:
0x55a558b16120>
> detach("package:testFinalizer", unload=TRUE)
Unloading /home/bill/packages/lib/testFinalizer
cleanup(<environment: 0x55a558b16120>)
    cleaning <environment: 0x55a558b16120>
> q("no")
cleanup(<environment: 0x55a558b16120>)
    <environment: 0x55a558b16120> has already been cleaned
$ R --quiet
> library(testFinalizer, lib="lib")
Loading testFinalizer from /home/bill/packages/lib
Installed finalizer for <environment:
0x55f8dac2d598>
> objects(all=TRUE)
character(0)
> q("no")
cleanup(<environment: 0x55f8dac2d598>)
    cleaning <environment: 0x55f8dac2d598>

On Fri, Dec 18, 2020 at 7:39 AM Bill Dunlap <williamwdunlap at gmail.com>
wrote:

> Have you tried using reg.finalizer(..., onexit=TRUE)?
>
> -BIll
>
> On Fri, Dec 18, 2020 at 7:29 AM Jiefei Wang <szwjf08 at gmail.com>
wrote:
>
>> Hi,
>>
>> I am looking for a way to clean up my package resources before R is
ended.
>> It looks like the .onUnload function would not be helpful as it would
not
>> be called before R is ended. This behavior has been described in the
>> document:
>>
>> *Note that packages are not detached nor namespaces unloaded at the end
of
>> an R session unless the user arranges to do so (e.g., via .Last).*
>>
>> I have also searched for ?.Last as the document says. However, the
.Last
>> function is for the end user to use, not for the package developers, so
I
>> am clueless now. How to clean up my package before R ends? Any
>> suggestions?
>>
>> Best,
>> Jiefei
>>
>>         [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> 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.
>>
>

	[[alternative HTML version deleted]]