在检查软件包向量是否需要安装时,我遇到了一个有趣的错误。要求并卸载 lme4 命名空间会在第二次执行时出现错误,但仅当按特定顺序检查其他一些包时才会出现错误。
isInstalled <- function(package) # is a package installed and usable?
{
loaded <- package %in% .packages()
out <- requireNamespace(package, quietly=F)
if(!loaded) try(unloadNamespace(package), silent=F)
out
}
isInstalled("car") # All return TRUE
isInstalled("nnet")
isInstalled("pbkrtest")
isInstalled("lme4")
isInstalled("nloptr")
isInstalled("lme4") # FALSE (only after commands above)
# no such symbol NLoptR_Optimize in package C:/__Rlibrary/nloptr/libs/x64/nloptr.dll
library(nloptr) # now fails, too
# Problem solved if nnet is checked before car (but not again after car)
我是不是做错了什么isInstalled
?
This might be related to the dependency structure of car
. Simplified version:
#install.packages(c("miniCRAN","igraph"))
d <- miniCRAN::makeDepGraph(c("car", "nnet", "pbkrtest", "lme4","nloptr"), suggests=FALSE)
plot(d) # for full dependency graph
R 的设计初衷并不是为了允许随意加载和卸载包。您可以尝试这样做,但不能保证成功(尽管经常会成功)。
From ?detach
:
如果包有命名空间,则分离它默认情况下不会卸载命名空间(甚至可能在 unload = TRUE 时也不会卸载),并且分离通常不会卸载任何动态加载的编译代码 (DLL)。此外,命名空间中注册的 S3 方法不会被删除。如果您在加载了命名空间的包上使用库,它会附加已加载命名空间的导出。因此,分离并重新附加包可能不会刷新包的部分或全部组件,并且是不可取的。
From ?devtools::unload
:
此函数尝试彻底卸载包,包括卸载其命名空间、删除 S4 类定义以及卸载任何已加载的 DLL。不幸的是,S4 类并不是真正设计为干净卸载的,因此我们必须手动修改类依赖关系图才能使其正常工作 - 这适用于我们已经测试过的情况,但可能还有其他情况。同样,自动 DLL 卸载最好针对简单场景进行测试(特别是使用 useDynLib(pkgname) 时,在其他情况下可能会失败。如果您确实遇到失败,请在以下位置提交错误报告:http://github.com/hadley/devtools/issues http://github.com/hadley/devtools/issues.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)