提问人:Ari B. Friedman 提问时间:8/8/2011 最后编辑:NelsonGonAri B. Friedman 更新时间:5/27/2022 访问量:547752
如何在不重启 R 的情况下卸载包
How to unload a package without restarting R
问:
我想在不重新启动 R 的情况下卸载包(主要是因为在我尝试不同的、冲突的包时重新启动 R 变得越来越令人沮丧,但可以想象,这可以在程序中使用一个函数,然后使用另一个函数——尽管命名空间引用可能是该用途的更好主意)。
?library
不显示任何可以卸载包的选项。
有一个建议可以卸载包,但以下两种方法都失败了:detach
detach(vegan)
错误:参数无效
detach(vegan)
name
detach("vegan")
错误:参数无效
detach("vegan")
name
那么如何卸载包裹呢?
答:
试试这个(有关更多详细信息,请参阅):?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)
评论
Hmisc
survival
splines
> detach("package:MASS", unload=TRUE) Error in detach("package:MASS", unload = TRUE) : invalid 'name' argument
我尝试了 kohske 写的答案,但我再次出现错误,所以我做了一些搜索并找到了对我有用的方法 (R 3.0.2):
require(splines) # package
detach(package:splines)
或者也
library(splines)
pkg <- "package:splines"
detach(pkg, character.only = TRUE)
评论
您还可以使用该命令,如下所示:unloadNamespace
unloadNamespace("sqldf")
该函数在卸载命名空间之前将其分离。
评论
可以取消选中 RStudio(包)中的复选框按钮。
评论
detach("package:packageToUnload", unload=TRUE)
只需转到“输出”窗口,然后单击“包”图标(它位于“绘图”和“帮助”图标之间)。从您要卸载的包裹中删除“勾选/复选标记”。
再次使用包装时,只需在包装前面打勾或复选标记或使用:
library (lme4)
评论
当您在脚本之间来回切换时,有时可能只需要卸载包。下面是一个简单的 IF 语句,该语句将防止在尝试卸载当前未加载的包时出现的警告。
if("package:vegan" %in% search()) detach("package:vegan", unload=TRUE)
在脚本的顶部包含此内容可能会有所帮助。
我希望这能让你开心!
detach(package:PackageName)
有效,无需使用引号。
我想添加一个替代解决方案。此解决方案不会直接回答您关于卸载包裹的问题,但恕我直言,它提供了一种更干净的替代方案来实现您的预期目标,据我所知,它广泛关注避免名称冲突和尝试不同的功能,如前所述:
主要是因为当我尝试不同的、冲突的包时重新启动 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
示例中使用的无法从全局命名空间访问。我认为这可能是一种比装卸包裹更干净的处理冲突的方式。
你可以尝试删除一个包(以及它带来的所有依赖项),但内存占用仍然会持续存在。不,也行不通。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
另一种选择是
devtools::unload("your-package")
这显然也处理了未删除的已注册 S3 方法的问题unloadNamespace()
评论
另请注意,您只能使用一次。如果您在没有重新运行的情况下第二次使用它,您将收到信息量不大的错误消息无效的“name”参数:unload()
library()
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
创建于 2020-05-09 由 reprex 软件包 (v0.3.0)
与@tjebo答案相连。
TL;DR
请使用,因为它们是相同的功能(1 比 1),并且是一个更轻量级的包(依赖项)。 只需重新导出函数即可。pkgload:::unload
devtools::unload
pkgload
devtools
pkgload:::unload
不幸的是,这是一个巨大的依赖关系(因为有很多自己的依赖关系),这更针对开发阶段。因此,如果您想在自己的软件包中使用该函数,或者您关心库大小,请记得使用 而不是 . 只需重新导出函数即可。devtools
devtools
unload
pkgload:::unload
devtools::unload
devtools
pkgload:::unload
请查看函数的页脚以快速确认重新导出或转到 github repodevtools::unload
> 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>
评论
.libPaths()
library
library
library()
require
library
detach