【问题标题】:How to unload a package without restarting R如何在不重新启动 R 的情况下卸载包
【发布时间】:2025-11-29 02:30:02
【问题描述】:

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

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

有一个suggestiondetach可以卸载包,但是以下都失败了:

detach(vegan)

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

detach("vegan")

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

那么我该如何卸载一个包呢?

【问题讨论】:

  • @Iterator:库是您找到包的位置。 (它们不是同义词。).libPaths() 为您提供系统上所有库的路径。
  • @Richie:谢谢。我在 R 上下文中得到了这一点,但我觉得 R 的使用以两种方式重载或使术语 library 变得模棱两可:1 - 与其他地方使用 library 不同,2 - 该术语在 @ 中使用987654333@ 加载...不是库,而是包。
  • @Iterator 你是对的。这是我需要的答案,在谷歌搜索时,我使用了“require 的对面”或“撤消 library”,因为这就是我通常加载“包”的方式。因此,正确命名会使问题更正确,但也更难找到。

标签: r package r-faq


【解决方案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)

【讨论】:

  • @hadley 确实。未引用的版本似乎不适用于最新版本的 R。我已经更新了 kohske 的答案以反映您的解决方案。
  • @AriB.Friedman,现在是as a question
  • &gt; detach("package:MASS", unload=TRUE) Error in detach("package:MASS", unload = TRUE) : invalid 'name' argument
  • 如果您收到无效的“名称”参数错误,请添加 character.only=TRUE。
  • > detach("package:kriging", unload=TRUE, character.only=T) 分离错误("package:kriging", unload = TRUE, character.only = T) : invalid '名称的论点。但是@rstober 解决方案确实有效!
【解决方案2】:

您也可以使用unloadNamespace 命令,如:

unloadNamespace("sqldf")

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

【讨论】:

  • 如果@kohske 的解决方案对你也不起作用,这对我有用
【解决方案3】:

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

【讨论】:

  • 值得补充的是,这会导致执行detach("package:packageToUnload", unload=TRUE) 命令,并且与already proposed solution. 没有什么不同
  • 此外,如果包是使用 rstudio install & restart 加载的(错误?),则不会检查该框。但是您可以选中和取消选中它。
【解决方案4】:

我尝试了 kohske 写的作为答案,但又遇到了错误,所以我做了一些搜索,发现这对我有用(R 3.0.2):

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

也可以

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

【讨论】:

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

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

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

将其包含在脚本顶部可能会有所帮助。

我希望这会让你开心!

【讨论】:

    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

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

      从全新的控制台或Session &gt; 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

      【讨论】:

        【解决方案8】:

        另一种选择是

        devtools::unload("your-package")
        

        这显然也处理issue of registered S3 methods that are not removedunloadNamespace()

        【讨论】:

        • 我一直在尝试分离 formula.tools。这是唯一对我有用的方法,至少在恢复所述包对 as.character 的影响方面。谢谢!!
        【解决方案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 无法从全局命名空间访问。我认为这可能是比加载和卸载包更清洁的冲突处理方式。

        【讨论】:

          【解决方案10】:

          另请注意,您只能使用一次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 日创建

          【讨论】:

            【解决方案11】:

            只需转到 OUTPUT 窗口,然后单击 Packages 图标(它位于 Plot 和 Help 图标之间)。从您要卸载的包中删除“tick / check mark”。

            若要再次使用该包装,只需在包装前添加一个“勾选或复选标记”或使用:

            library (lme4)
            

            【讨论】:

            • 除非您有自己的自定义库路径,否则不会。它没有显示在“Packages”下,所以你必须执行上述方法
            最近更新 更多