如何卸载一个包而不重新启动R

我希望卸载一个包而不必重新启动R(主要是因为在尝试不同的、冲突的包时重新启动R会令人沮丧,但可以想象,这可以在程序中使用一个函数,然后使用另一个函数——尽管名称空间引用可能是更好的使用方法)。

?library没有显示任何卸载包的选项。

有一个建议detach可以卸载包,但以下两个都失败:

detach(vegan)

detach(vegan)错误:无效的name参数

detach("vegan")

detach("vegan")错误:无效的name参数

那我怎么卸货呢?

500595 次浏览

试试这个(详见?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)

我尝试了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(包)中的复选框按钮。

RStudio packages pane

只需转到OUTPUT窗口,然后单击Packages图标(它位于情节和帮助图标之间)。从要卸载的包中删除“打勾/对号”。

对于再次使用包,只需在包前面放一个“勾或对号”或使用:

library (lme4)

当您在脚本之间来回切换时,可能只需要有时来卸载包。下面是一个简单的IF语句,它可以防止在试图卸载当前未加载的包时出现警告。

if("package:vegan" %in% search()) detach("package:vegan", unload=TRUE)

在脚本顶部包含这一点可能会有所帮助。

我希望这能让你开心!

detach(package:PackageName)可以使用,没有必要使用引号。

我想补充一个替代方案。这个解决方案并没有直接回答你关于卸货包的问题,但是,恕我直言,它提供了一个更干净的替代方案来实现你想要的目标,我理解,广泛关注避免名称冲突和尝试不同的功能,如前所述:

主要是因为当我尝试不同的、冲突的包时重新启动R是令人沮丧的,但可以想象,这可以在程序中使用一个函数,然后使用另一个函数——尽管命名空间引用可能是更好的使用方法

解决方案

通过withr包提供的with_package函数提供了以下可能性:

将包附加到搜索路径,执行代码,然后从搜索路径中删除包。但是,包名称空间是卸载的不< em > < / em >

例子

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()

还要注意,您只能使用unload()一次。如果你第二次使用它而没有重新运行library(),你会得到不是很有信息的错误消息无效的“name”参数:

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包 (v0.3.0)创建于2020-05-09

连接到@tjebo答案。

< p > TL;博士
请使用pkgload:::unload而不是devtools::unload,因为它们是相同的函数(1对1),pkgload是一个更轻的包(nr依赖)。devtools简单地重新导出pkgload:::unload函数

不幸的是,devtools是一个巨大的依赖项(因为devtools有很多自己的依赖项),它更有开发阶段的针对性。因此,如果你想在自己的包中使用unload函数,或者你关心库的大小,请记住使用pkgload:::unload而不是devtools::unload。简单地重新导出pkgload:::unload函数。

请检查devtools::unload函数的页脚以快速确认重新导出或转到github回购

> 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>