Unload a package and all dependencies

我怕爱的太早我们不能终老 提交于 2021-02-04 15:08:47

问题


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

回答1:


This works for me -- a bit crude but gets the job done.

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)];
  while( ! length(todetach) == 0 ){
    for(i in seq_along(todetach)){
      suppressWarnings(tryCatch(detach(todetach[i], unload=TRUE, character.only=TRUE, force=TRUE),error = function(x) return(NA)))
    }
    nowattached <- search();
    todetach <- sample(nowattached[!(nowattached %in% currentlyattached)]);
  }

  #try to unload packages that are still loaded
  nowloaded <- loadedNamespaces(); 
  tounload <- nowloaded[!(nowloaded %in% currentlyloaded)];
  while( ! length(tounload) == 0 ){
    for(i in seq_along(todetach)){
      suppressWarnings(tryCatch(unloadNamespace(tounload[i]),error = function(x) return(NA)))
    }
    nowloaded <- loadedNamespaces(); 
    tounload <- sample(nowloaded[!(nowloaded %in% currentlyloaded)]);
  }
});


来源:https://stackoverflow.com/questions/17772762/unload-a-package-and-all-dependencies

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!