[Rd] Exiting R and package detachment?

From: Henrik Bengtsson <hb_at_maths.lth.se>
Date: Fri 10 Jun 2005 - 09:43:29 GMT


Hi,

is there away to assure that a package is detached when R quits? I know about .Last(), but that requires the user to setup that function. What I am looking for is a way for the package to do this itself, without asking the user to edit "their" .Last(). From ?setHook I know that:

   "...when an R is finished, packages are not detached and namespaces are not unloaded, so the corresponding hooks will not be run."

I am going to use this to load settings from file when a package loads and automatically save (by optionally prompting the user) them back to file when the package is no longer available (==detached/unloaded/R quits). I am currently loading the settings in .First.lib() and have code in .Last.lib() to save them.

Are there other ways to assure functions to be called when R quits? The best I can think of now is to "hack" .Last() by doing something like

if (!exists(".LastOriginal", mode="function")) {

   .LastOriginal <<- get(".Last", envir=.GlobalEnv);

   .Last <<- function(..., envir=parent.frame()) {

     for (fun in getHook(".Last")) {
       if (is.character(fun))
         fun <- get(fun, mode="function")
       try(fun());
     }
     eval(.LastOriginal(...), envir=envir);
   } # .Last()
}

Then in package <pkg>:
.First.lib <- function(libname, pkgname) {

   # Detach package when R finishes.
   setHook(".Last", function(...) {

     pos <- match(paste("package:", pkgname, sep=""), search());
     if (!is.na(pos))
       detach(pos=pos);

   })
}

However, this will be broken if user redefines .Last(). What about defining a hook "onSessionExit" to be called before (after?) .Last() is called. In analogue to on.exit() one could then define

onSessionExit <- function(fcn, ...) {

   setHook("onSessionExit", fcn, ...);
}

Just curious, the above quote makes me wonder what is the rational for the behavior? Was it made on purpose or is it simply just easier for R to finish without detaching/unloading packages first? In what situations to you have "clean-up" code for a package that is only called when detach("package:<pkg>") is used? One situation I can imaging is when a bundle of packages are loaded and when you detach the package that all other packages requires, the other packages are also detached for conveniency.

Best wishes

Henrik



R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Fri Jun 10 19:47:44 2005

This archive was generated by hypermail 2.1.8 : Mon 20 Feb 2006 - 03:21:08 GMT