我想卸载一个包而不必重新启动 R(主要是因为在我尝试不同的、冲突的包时重新启动 R 会令人沮丧,但可以想象这可以在程序中使用一个函数然后使用另一个函数——尽管命名空间对于这种用途,引用可能是一个更好的主意)。
?library
没有显示任何可以卸载包的选项。
有一个 detach
可以卸载包的 suggestion,但以下都失败:
detach(vegan)
分离错误(素食主义者):名称参数无效
detach("vegan")
分离错误(“vegan”):名称参数无效
那么如何卸载包呢?
.libPaths()
为您提供系统上所有库的路径。
library
重载或模棱两可:1 - 它与其他地方的 library
用法不同,2 - 该术语在 { 3} 加载...不是一个库,而是一个包。
require
相反”或“撤消 library
”,因为这是我通常加载“包”的方式。因此,正确命名它会使问题更正确,但也更难找到。
试试这个(有关详细信息,请参阅 ?detach
):
detach("package:vegan", unload=TRUE)
可以同时加载一个包的多个版本(例如,如果您在不同的库中有一个开发版本和一个稳定版本)。为确保所有副本均已分离,请使用此功能。
detach_package <- function(pkg, character.only = FALSE)
{
if(!character.only)
{
pkg <- deparse(substitute(pkg))
}
search_item <- paste("package", pkg, sep = ":")
while(search_item %in% search())
{
detach(search_item, unload = TRUE, character.only = TRUE)
}
}
用法是,例如
detach_package(vegan)
或者
detach_package("vegan", TRUE)
您还可以使用 unloadNamespace
命令,如下所示:
unloadNamespace("sqldf")
该函数在卸载之前分离命名空间。
您可以取消选中 RStudio(包)中的复选框按钮。
https://i.stack.imgur.com/A7TOO.png
detach("package:packageToUnload", unload=TRUE)
命令,并且与 already proposed solution. 没有什么不同
我尝试了 kohske 写的答案,但我又遇到了错误,所以我做了一些搜索,发现这对我有用(R 3.0.2):
require(splines) # package
detach(package:splines)
或者也
library(splines)
pkg <- "package:splines"
detach(pkg, character.only = TRUE)
当您在脚本之间来回切换时,有时可能只需要卸载一个包。这是一个简单的 IF 语句,可以防止在您尝试卸载当前未加载的包时出现警告。
if("package:vegan" %in% search()) detach("package:vegan", unload=TRUE)
在脚本顶部包含此内容可能会有所帮助。
我希望这会让你开心!
detach(package:PackageName)
有效,无需使用引号。
您可以try 使用 unloadNamespace()
删除所有想要删除的包(以及它带来的所有依赖项),但 内存占用 仍将持续存在。不,detach("package:,packageName", unload=TRUE, force = TRUE)
也不起作用。
从全新的控制台或 Session > Restart R
使用 pryr
包检查内存:
pryr::mem_used()
# 40.6 MB ## This will depend on which packages are loaded obviously (can also fluctuate a bit after the decimal)
检查我的sessionInfo()
R version 3.6.1 (2019-07-05)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 17763)
Matrix products: default
locale:
[1] LC_COLLATE=English_Canada.1252 LC_CTYPE=English_Canada.1252 LC_MONETARY=English_Canada.1252 LC_NUMERIC=C
[5] LC_TIME=English_Canada.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] compiler_3.6.1 pryr_0.1.4 magrittr_1.5 tools_3.6.1 Rcpp_1.0.3 stringi_1.4.3 codetools_0.2-16 stringr_1.4.0
[9] packrat_0.5.0
让我们加载 Seurat
包并检查新的内存占用:
library(Seurat)
pryr::mem_used()
# 172 MB ## Likely to change in the future but just to give you an idea
让我们使用 unloadNamespace()
删除所有内容:
unloadNamespace("Seurat")
unloadNamespace("ape")
unloadNamespace("cluster")
unloadNamespace("cowplot")
unloadNamespace("ROCR")
unloadNamespace("gplots")
unloadNamespace("caTools")
unloadNamespace("bitops")
unloadNamespace("fitdistrplus")
unloadNamespace("RColorBrewer")
unloadNamespace("sctransform")
unloadNamespace("future.apply")
unloadNamespace("future")
unloadNamespace("plotly")
unloadNamespace("ggrepel")
unloadNamespace("ggridges")
unloadNamespace("ggplot2")
unloadNamespace("gridExtra")
unloadNamespace("gtable")
unloadNamespace("uwot")
unloadNamespace("irlba")
unloadNamespace("leiden")
unloadNamespace("reticulate")
unloadNamespace("rsvd")
unloadNamespace("survival")
unloadNamespace("Matrix")
unloadNamespace("nlme")
unloadNamespace("lmtest")
unloadNamespace("zoo")
unloadNamespace("metap")
unloadNamespace("lattice")
unloadNamespace("grid")
unloadNamespace("httr")
unloadNamespace("ica")
unloadNamespace("igraph")
unloadNamespace("irlba")
unloadNamespace("KernSmooth")
unloadNamespace("leiden")
unloadNamespace("MASS")
unloadNamespace("pbapply")
unloadNamespace("plotly")
unloadNamespace("png")
unloadNamespace("RANN")
unloadNamespace("RcppAnnoy")
unloadNamespace("tidyr")
unloadNamespace("dplyr")
unloadNamespace("tibble")
unloadNamespace("RANN")
unloadNamespace("tidyselect")
unloadNamespace("purrr")
unloadNamespace("htmlwidgets")
unloadNamespace("htmltools")
unloadNamespace("lifecycle")
unloadNamespace("pillar")
unloadNamespace("vctrs")
unloadNamespace("rlang")
unloadNamespace("Rtsne")
unloadNamespace("SDMTools")
unloadNamespace("Rdpack")
unloadNamespace("bibtex")
unloadNamespace("tsne")
unloadNamespace("backports")
unloadNamespace("R6")
unloadNamespace("lazyeval")
unloadNamespace("scales")
unloadNamespace("munsell")
unloadNamespace("colorspace")
unloadNamespace("npsurv")
unloadNamespace("compiler")
unloadNamespace("digest")
unloadNamespace("R.utils")
unloadNamespace("pkgconfig")
unloadNamespace("gbRd")
unloadNamespace("parallel")
unloadNamespace("gdata")
unloadNamespace("listenv")
unloadNamespace("crayon")
unloadNamespace("splines")
unloadNamespace("zeallot")
unloadNamespace("reshape")
unloadNamespace("glue")
unloadNamespace("lsei")
unloadNamespace("RcppParallel")
unloadNamespace("data.table")
unloadNamespace("viridisLite")
unloadNamespace("globals")
现在检查 sessionInfo()
:
R version 3.6.1 (2019-07-05)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 17763)
Matrix products: default
locale:
[1] LC_COLLATE=English_Canada.1252 LC_CTYPE=English_Canada.1252 LC_MONETARY=English_Canada.1252 LC_NUMERIC=C
[5] LC_TIME=English_Canada.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] tools_3.6.1 stringr_1.4.0 rstudioapi_0.10 pryr_0.1.4 jsonlite_1.6 gtools_3.8.1 R.oo_1.22.0
[8] magrittr_1.5 Rcpp_1.0.3 R.methodsS3_1.7.1 stringi_1.4.3 plyr_1.8.4 reshape2_1.4.3 codetools_0.2-16
[15] packrat_0.5.0 assertthat_0.2.1
检查内存占用:
pryr::mem_used()
# 173 MB
Link to screen-cast demonstration
另一种选择是
devtools::unload("your-package")
这显然也处理带有 unloadNamespace()
的 issue of registered S3 methods that are not removed
另请注意,您只能使用 unload()
一次。如果您第二次使用它而不重新运行 library()
,您将收到信息量不大的错误消息 invalid 'name' argument:
library(vegan)
#> Loading required package: permute
#> Loading required package: lattice
#> This is vegan 2.5-6
detach("package:vegan", unload=TRUE)
detach("package:vegan", unload=TRUE)
#> Error in detach("package:vegan", unload = TRUE): invalid 'name' argument
由 reprex package (v0.3.0) 于 2020 年 5 月 9 日创建
我想添加一个替代解决方案。该解决方案不会直接回答您关于卸载包的问题,但是恕我直言,它提供了一种更简洁的替代方案来实现您想要的目标,据我所知,它广泛关注避免名称冲突和尝试不同的功能,如所述:
主要是因为在我尝试不同的、有冲突的包时重新启动 R 令人沮丧,但可以想象,这可以在程序中使用一个函数,然后使用另一个函数——尽管命名空间引用对于这种用途可能是一个更好的主意
解决方案
通过 withr
包提供的功能 with_package
提供了以下可能性:
将包附加到搜索路径,执行代码,然后从搜索路径中删除包。但是,包命名空间并未卸载。
例子
library(withr)
with_package("ggplot2", {
ggplot(mtcars) + geom_point(aes(wt, hp))
})
# Calling geom_point outside withr context
exists("geom_point")
# [1] FALSE
示例中使用的 geom_point
无法从全局命名空间访问。我认为这可能是比加载和卸载包更清洁的冲突处理方式。
只需转到 OUTPUT 窗口,然后单击 Packages 图标(它位于 Plot 和 Help 图标之间)。从您要卸载的包中删除“勾选/复选标记”。
要再次使用该包装,只需在包装前添加一个“勾选或复选标记”或使用:
library (lme4)
与@tjebo 答案连接。
TL;DR
请使用 pkgload:::unload
而不是 devtools::unload
,因为它们是相同的功能(1 到 1),而 pkgload
是一个更轻量级的包(nr 个依赖项)。 devtools
只需重新导出 pkgload:::unload
函数。
不幸的是,devtools
是一个巨大的依赖项(因为 devtools
有很多自己的依赖项),它更具开发阶段的针对性。因此,如果您想在自己的包中使用 unload
函数或者您关心库大小,请记住使用 pkgload:::unload
而不是 devtools::unload
。 devtools
只需重新导出 pkgload:::unload
函数。
请检查devtools::unload
函数的页脚以快速确认重新导出或转到github repo
> devtools::unload
function (package = pkg_name(), quiet = FALSE)
{
if (package == "compiler") {
oldEnable <- compiler::enableJIT(0)
if (oldEnable != 0) {
warning("JIT automatically disabled when unloading the compiler.")
}
}
if (!package %in% loadedNamespaces()) {
stop("Package ", package, " not found in loaded packages or namespaces")
}
unregister_methods(package)
unloaded <- tryCatch({
unloadNamespace(package)
TRUE
}, error = function(e) FALSE)
if (!unloaded) {
unload_pkg_env(package)
unregister_namespace(package)
}
clear_cache()
unload_dll(package)
}
<bytecode: 0x11a763280>
<environment: namespace:pkgload>
Hmisc
它还加载survival
和splines
有没有办法一起卸载这些组?> detach("package:MASS", unload=TRUE) Error in detach("package:MASS", unload = TRUE) : invalid 'name' argument