加载R包unloadNamespace时,我该怎么办
当我们的R底层逻辑不清楚的时候,bug就会不经意地来到我们眼前。比如:
library(ggpubr)
Error in value[3L] :
Package ‘ggpubr’ version 0.3.0 cannot be unloaded:
Error in unloadNamespace(package) : namespace ‘ggpubr’ is imported by ‘immunarch’ so cannot be unloaded
In addition: Warning message:
package ‘ggpubr’ was built under R version 3.6.3
这时候,我该怎么办呢?就是把上一层的Namespace,给unload掉,再加载。
unloadNamespace(”immunarch“)
library(ggpubr)
library(immunarch)
那么,为什么会报这样的错呢?首先我们要知道什么是命名空间:
《维基百科》中说 “命名空间是对作用域的一种特殊的抽象”,在这里我用一个比方来具体说明一下:
比如张三在公司 A,他的工号是 111,李四在公司 B,他的工号也是 111,因为两个人在不同的公司,他们俩的工号可以相同但是不会引起混乱,这里的公司就表示一个独立的命名空间,如果两个人在一个公司的话,他们的工号就不能相同,否则光看工号也不知道到底是谁
我们在载入一个R包的时候也会把他的命名空间导进来,但是如果再导入一样的,就会冲突了。比如这一天店里里来了两个111 ,都带了对象,我们要说:111的对象麻烦结下账。这下麻烦了。
在R里面如何看当前的命名空间呢?
library(Seurat)
loadedNamespaces()
[1] “gridExtra” “gplots” “graphics” “rsvd” “stringi”
[6] “pbapply” “lattice” “bitops” “vctrs” “Rdpack”
[11] “mgcv” “survival” “spatstat.data” “later” “tidyr”
[16] “tensor” “R.utils” “uwot” “data.table” “rstudioapi”
[21] “base” “npsurv” “deldir” “nlme” “ggplot2”
[26] “SDMTools” “htmlwidgets” “future” “listenv” “ggrepel”
[31] “leiden” “tools” “irlba” “parallel” “magrittr”
[36] “grDevices” “methods” “R.oo” “ape” “Rcpp”
[41] “KernSmooth” “promises” “gdata” “RcppParallel” “httr”
[46] “assertthat” “globals” “lifecycle” “R6” “munsell”
[51] “gtools” “png” “R.methodsS3” “digest” “caTools”
[56] “codetools” “sctransform” “splines” “cowplot” “lmtest”
[61] “colorspace” “pkgconfig” “pillar” “lsei” “ROCR”
[66] “xtable” “utils” “abind” “plyr” “reticulate”
[71] “RANN” “gtable” “zoo” “datasets” “stats”
[76] “tidyselect” “purrr” “reshape2” “ica” “fastmap”
[81] “bibtex” “crosstalk” “goftest” “RcppAnnoy” “viridisLite”
[86] “tibble” “rlang” “cluster” “future.apply” “Seurat”
[91] “zeallot” “glue” “Matrix” “spatstat” “scales”
[96] “backports” “metap” “RColorBrewer” “ggridges” “stringr”
[101] “igraph” “Rtsne” “dplyr” “shiny” “polyclip”
[106] “grid” “spatstat.utils” “gbRd” “httpuv” “htmltools”
[111] “yaml” “lazyeval” “plotly” “tsne” “crayon”
[116] “fitdistrplus” “MASS” “jsonlite” “rpart” “mime”
[121] “compiler”
但是这时候,我再加载
library(Rtsne)
是可以的,为什么?
所以,我们还是看一下这个报错的根源:library的源码,他一定是在某个地方加了判断:
if (packageHasNamespace(package, which.lib.loc)) {
if (isNamespaceLoaded(package)) {
newversion <- as.numeric_version(pkgInfo$DESCRIPTION["Version"])
oldversion <- as.numeric_version(getNamespaceVersion(package))
if (newversion != oldversion) {
tryCatch(unloadNamespace(package), error = function(e) {
P <- if (!is.null(cc <- conditionCall(e)))
paste("Error in", deparse(cc)[1L], ": ")
else "Error : "
stop(gettextf("Package %s version %s cannot be unloaded:\n %s",
sQuote(package), oldversion, paste0(P,
conditionMessage(e), "\n")), domain = NA)
})
}
遇到这种情况往往是从两个不同的地方导入包导致的。
https://github.com/RevolutionAnalytics/checkpoint/issues/155
https://stackoverflow.com/questions/37031457/problems-trying-to-install-package-in-r
https://zhuanlan.zhihu.com/p/42399724