如何在不重启 R 的情况下卸载包

How to unload a package without restarting R

提问人:Ari B. Friedman 提问时间:8/8/2011 最后编辑:NelsonGonAri B. Friedman 更新时间:5/27/2022 访问量:547752

问:

我想在不重新启动 R 的情况下卸载包(主要是因为在我尝试不同的、冲突的包时重新启动 R 变得越来越令人沮丧,但可以想象,这可以在程序中使用一个函数,然后使用另一个函数——尽管命名空间引用可能是该用途的更好主意)。

?library不显示任何可以卸载包的选项。

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

detach(vegan)

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

detach("vegan")

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

那么如何卸载包裹呢?

R-FAQ

评论

5赞 Richie Cotton 8/8/2011
@Iterator:库是查找包的位置。(它们不是同义词。 为您提供系统上所有库的路径。.libPaths()
20赞 Iterator 8/8/2011
@Richie:谢谢。我在 R 上下文中理解了这一点,但我觉得 R 用法以两种方式使该术语过载或模棱两可:1 - 它与其他地方的用法不同,以及 2 - 该术语用于加载......不是一个库,而是一个包。librarylibrarylibrary()
4赞 isomorphismes 7/2/2013
@Iterator 你是对的。这就是我需要的答案,在谷歌搜索时,我使用了“相反”或“撤消”,因为这就是我通常加载“包”的方式。因此,正确地命名它会使问题更正确,但也更难找到。requirelibrary
0赞 Jari Oksanen 5/6/2023
我通常使用标准 R 命令,没有任何外部包。它对我有用,但还有很多事情我不知道。detach

答:

832赞 kohske 8/8/2011 #1

试试这个(有关更多详细信息,请参阅):?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)

评论

3赞 Ari B. Friedman 2/10/2013
@hadley确实如此。未加引号的版本似乎在最新版本的 R 中不起作用。我已经更新了 kohske 的答案以反映您的解决方案。
0赞 Eric Fail 7/9/2013
@AriB.Friedman,有没有办法一次分离多个包?当我加载时,说它也会加载,有没有办法将该组卸载在一起?Hmiscsurvivalsplines
3赞 Mona Jalal 2/12/2014
> detach("package:MASS", unload=TRUE) Error in detach("package:MASS", unload = TRUE) : invalid 'name' argument
7赞 Dan Tenenbaum 2/13/2014
如果收到无效的“name”参数错误,请添加 character.only=TRUE。
4赞 Andrew 11/17/2015
> detach(“package:kriging”, unload=TRUE, character.only=T) detach(“package:kriging”, unload = TRUE, character.only = T) 中的错误:无效的“name”参数。但是@rstober解决方案确实有效!
10赞 Mehrad Mahmoudian 6/11/2014 #2

我尝试了 kohske 写的答案,但我再次出现错误,所以我做了一些搜索并找到了对我有用的方法 (R 3.0.2):

require(splines) # package
detach(package:splines)

或者也

library(splines)
pkg <- "package:splines"
detach(pkg, character.only = TRUE)

评论

3赞 alko989 6/11/2014
你得到什么错误?因为它对我有用(R 3.1)。第二种解决方案是与@koshke相同的答案,只是没有卸载(因此没有卸载包命名空间)。
0赞 Mehrad Mahmoudian 7/3/2014
我遇到了同样的错误。关键是我给出了与@Kohske相同的解决方案,但包名称不同。它只是意味着如果你使用包:那么它应该可以正常工作,但如果你不使用它,你会得到与问题中相同的错误。;)
0赞 Gregor Thomas 3/12/2015
等。。。所以你试图卸载一个甚至没有加载的包?你很惊讶你有一个错误?
0赞 Mehrad Mahmoudian 3/12/2015
@Gregor 在按下反对按钮之前,请您再阅读一遍所有内容吗?!!!函数 require() 和 library() 几乎做同样的事情(至少在这种情况下),所以包已经加载了!我不对你缺乏信息负责!!
120赞 rstober 3/11/2015 #3

您还可以使用该命令,如下所示:unloadNamespace

unloadNamespace("sqldf")

该函数在卸载命名空间之前将其分离。

评论

2赞 Wassadamo 8/8/2019
如果@kohske的解决方案也不适合你,这对我有用
44赞 Ajay Ohri 7/5/2015 #4

可以取消选中 RStudio(包)中的复选框按钮。

RStudio packages pane

评论

22赞 Konrad 1/10/2017
值得补充的是,这会导致命令被执行,并且与已经提出的解决方案没有什么不同。detach("package:packageToUnload", unload=TRUE)
2赞 jiggunjer 7/22/2019
此外,如果软件包是使用 rstudio install & restart 加载的,则不会选中该框(错误?但是您可以选中和取消选中它。
1赞 EsKe 6/20/2016 #5

只需转到“输出”窗口,然后单击“包”图标(它位于“绘图”和“帮助”图标之间)。从您要卸载的包裹中删除“勾选/复选标记”。

再次使用包装时,只需在包装前面打勾或复选标记或使用:

library (lme4)

评论

1赞 zazu 7/29/2016
除非您有自己的自定义库路径,否则不会。它不会显示在“包”下,因此您必须执行上述方法
10赞 dca 4/27/2017 #6

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

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

在脚本的顶部包含此内容可能会有所帮助。

我希望这能让你开心!

9赞 Alper 7/22/2018 #7

detach(package:PackageName)有效,无需使用引号。

2赞 Konrad 8/4/2019 #8

我想添加一个替代解决方案。此解决方案不会直接回答您关于卸载包裹的问题,但恕我直言,它提供了一种更干净的替代方案来实现您的预期目标,据我所知,它广泛关注避免名称冲突和尝试不同的功能,如前所述:

主要是因为当我尝试不同的、冲突的包时重新启动 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示例中使用的无法从全局命名空间访问。我认为这可能是一种比装卸包裹更干净的处理冲突的方式。

6赞 Matthew J. Oldach 1/16/2020 #9

你可以尝试删除一个包(以及它带来的所有依赖项),但内存占用仍然会持续存在。不,也行不通。unloadNamespace()detach("package:,packageName", unload=TRUE, force = TRUE)

从全新的控制台或检查带有软件包的内存:Session > Restart Rpryr

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

截屏演示链接

7赞 tjebo 5/5/2020 #10

另一种选择是

devtools::unload("your-package")

这显然也处理了未删除的已注册 S3 方法的问题unloadNamespace()

评论

1赞 jruf003 9/13/2021
我一直在尝试分离formula.tools。这是唯一对我有用的方法,至少在恢复所述包对 as.character 的影响方面是这样。谢谢!!
4赞 Matifou 5/10/2020 #11

另请注意,您只能使用一次。如果您在没有重新运行的情况下第二次使用它,您将收到信息量不大的错误消息无效的“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)

1赞 polkas 5/27/2022 #12

与@tjebo答案相连。

TL;DR
请使用,因为它们是相同的功能(1 比 1),并且是一个更轻量级的包(依赖项)。 只需重新导出函数即可。
pkgload:::unloaddevtools::unloadpkgloaddevtoolspkgload:::unload

不幸的是,这是一个巨大的依赖关系(因为有很多自己的依赖关系),这更针对开发阶段。因此,如果您想在自己的软件包中使用该函数,或者您关心库大小,请记得使用 而不是 . 只需重新导出函数即可。devtoolsdevtoolsunloadpkgload:::unloaddevtools::unloaddevtoolspkgload:::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>