Thank you! This solution works! I actually tried reg.finalizer but it didn't work when it is a part of the package code, so I thought this is not the right function. Your example is very helpful. Putting the function inside the package initializer makes the finalizer works as I wish. Not sure why it behaves differently when in different locations but this is good enough for me. Many thanks!
Best, Jiefei On Sat, Dec 19, 2020 at 1:09 AM Bill Dunlap <williamwdun...@gmail.com> wrote: > 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 <williamwdun...@gmail.com> > wrote: > >> Have you tried using reg.finalizer(..., onexit=TRUE)? >> >> -BIll >> >> On Fri, Dec 18, 2020 at 7:29 AM Jiefei Wang <szwj...@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@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]] ______________________________________________ R-help@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.