I am trying to unload a package with all of its dependencies. The problem that I am running into is the order in which to unload dependencies. Because dependencies are recursive, they can only be unloaded from bottom-up in the dependency tree.
Is there an easy or native way in R to accomplish this? Below a first go in what I would like to accomplish:
eval_current <- function(expr, envir=parent.frame(), timeout=60){
#set the timeout
setTimeLimit(elapsed=timeout, transient=TRUE);
#currently loaded packages
currentlyattached <- search();
currentlyloaded <- loadedNamespaces();
on.exit({
#reset time limit
setTimeLimit(cpu=Inf, elapsed=Inf, transient=FALSE);
#try to detach packages that were attached during eval
nowattached <- search();
todetach <- nowattached[!(nowattached %in% currentlyattached)];
for(i in seq_along(todetach)){
try(detach(todetach[i], unload=TRUE, character.only=TRUE, force=TRUE));
}
#try to unload packages that are still loaded
nowloaded <- loadedNamespaces();
tounload <- nowloaded[!(nowloaded %in% currentlyloaded)];
for(i in seq_along(tounload)){
try(unloadNamespace(tounload[i]));
}
});
eval(expr, envir)
}
But it results in:
> eval_current({library(ggplot2); qplot(rnorm(100));})
Error in unloadNamespace(tounload[i]) :
namespace ‘colorspace’ is imported by ‘munsell’ so cannot be unloaded
Error in unloadNamespace(tounload[i]) :
namespace ‘dichromat’ is imported by ‘scales’ so cannot be unloaded
Error in unloadNamespace(tounload[i]) :
namespace ‘grid’ is imported by ‘gtable’ so cannot be unloaded
Error in unloadNamespace(tounload[i]) :
namespace ‘labeling’ is imported by ‘scales’ so cannot be unloaded
Error in unloadNamespace(tounload[i]) :
namespace ‘munsell’ is imported by ‘scales’ so cannot be unloaded
killall R; R
instead. Processes are cheap. – Bigotdevtools::unload
for our best attempt at this. But as @DirkEddelbuettel says, if there's any way to use a new process instead, you're better off doing that. R is not designed to cleanly unload packages. – Nunodevtools::unload
does not attempt to do any recursive unloading of dependencies right? Or am I missing something? – Astrogation