8

我正在尝试卸载包含所有依赖项的包。我遇到的问题是卸载依赖项的顺序。因为依赖关系是递归的,所以只能从依赖关系树的自下而上卸载它们。

R中是否有一种简单或本土化的方法来实现这一点?下面是我想完成的第一步:

eval_current<-function(expr,envir=parent.frame(),超时=60){#设置超时setTimeLimit(已用时间=超时,瞬态=真);#当前加载的包当前附加的<-search();当前加载的<-loadedNamespaces();on.exit(退出)({#重置时间限制设置时间限制(cpu=Inf,运行时间=Inf、瞬态=FALSE);#尝试分离评估期间附加的包现在附加<-search();todetach<-nowattached[!(以%currentlyattached表示的nowattached%)];for(i in seq_along(todetach)){try(分离(分离[i],unload=TRUE,character.only=TRUE);}#尝试卸载仍在加载的程序包nowloaded<-loadedNamespaces();tounload<-nowloaded[!(当前加载%中的当前加载%)];for(i in seq_along(tounload)){try(unloadNamespace(tounload[i]));}    });评估(expr,envir)}

但结果是:

>eval_current({库(ggplot2);qplot(rnorm(100));})unloadNamespace(tounload[i])中出错:命名空间“colorspace”由“munsell”导入,因此无法卸载unloadNamespace(tounload[i])中出错:命名空间“dichromat”由“scales”导入,因此无法卸载unloadNamespace(tounload[i])中出错:命名空间“grid”由“gtable”导入,因此无法卸载unloadNamespace(tounload[i])中出错:命名空间“labeling”由“scales”导入,因此无法卸载unloadNamespace(tounload[i])中出错:命名空间“munsell”由“scales”导入,因此无法卸载
8
  • 我想要基尔拉尔R;R(右)而不是。过程很便宜。 评论 2013年7月21日17:31
  • 哈哈,是的,这已经是一个特定于windows的解决方案。在unix上,我们确实可以使用一个临时的fork。 评论 2013年7月21日18:06
  • 1
    你每花一分钟在Windows疣周围进行工程设计,$Deity就会杀死一只小猫。只是不要这样做。 评论 2013年7月21日18:10
  • 我确信Rcpp在Windows上编译时没有进行一些调整:-) 评论 2013年7月21日18:24
  • 我们不主张您可以完全卸载其DLL。其他一些人也有其他意见(cf package devtools),但当然可以这样做。Rcpp代码对Windoze只有最小的调整。做得更多意味着我的猫真正地生我的气。 评论 2013年7月21日18:28

1答案1

重置为默认值
2

这对我有用——有点粗糙,但能完成任务。

on.exit(退出)({#重置时间限制设置时间限制(cpu=Inf,运行时间=Inf、瞬态=FALSE);#尝试分离评估期间附加的包现在附加<-search();todetach<-nowattached[!(以%currentlyattached表示的nowattached%)];while(!长度(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[!(nowatched%in%currentlyattached)]);}#尝试卸载仍在加载的包nowloaded<-loadedNamespaces();tounload<-nowloaded[!(当前加载%中的当前加载%)];while(!长度(tounload)==0){for(i in seq_along(todetach)){suppressWarnings(tryCatch(unloadNamespace(tounload[i]),错误=函数(x)return(NA))}nowloaded<-loadedNamespaces();tounload<-sample(当前加载[!(当前加载%中的当前加载%)]);}});
1
  • 我认为第二个while中的for循环应该是for(seq_along(tounload)中的I) 评论 2016年12月30日9:50

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.