如何在不重新启动R的情况下卸载软件包


540

我想卸载软件包而不必重新启动R(主要是因为我尝试不同的方法时重新启动R令人沮丧,但冲突的软件包变得令人沮丧,但是可以想象这可以在程序中使用一个功能,然后使用另一个功能-尽管命名空间对于这种用途,引用可能是一个更好的主意)。

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

有一种建议detach可以卸载包,但都失败了以下内容:

detach(vegan)

错误detach(vegan)name参数无效

detach("vegan")

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

那么如何卸载包裹?


4
@Iterator:库是您找到软件包的位置。(它们不是同义词。).libPaths()为您提供了系统上所有库的路径。
Richie Cotton

16
@Richie:谢谢。我在R上下文中了解到这一点,但我觉得R用法library在两种方面超载或使该术语含糊不清:1- library与其他地方的用法不同,2-该术语用于library()加载...不是库,但一个包。
Iterator

2
@Iterator你是对的。这就是我需要的答案,在谷歌搜索时,我使用“相反require”或“撤消library”,因为这通常是我加载,erm,“ packages”的方式。因此,正确地命名它可以使问题更正确,但也更难找到。
同构

Answers:


656

试试看(?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
@哈德利确实。未引用版本在R的最新版本中似乎不起作用。我更新了kohske的答案以反映您的解决方案。
Ari B. Friedman

1
@ AriB.Friedman,现在是一个问题
埃里克·菲尔

1
> detach("package:MASS", unload=TRUE) Error in detach("package:MASS", unload = TRUE) : invalid 'name' argument
蒙娜·贾拉勒

5
如果收到无效的“名称”参数错误,请添加character.only = TRUE。
Dan Tenenbaum 2014年

2
> detach(“ package:kriging”,unload = TRUE,character.only = T)detach(“ package:kriging”,unload = TRUE,character.only = T)错误:无效的'name'参数。但是@rstober解决方案确实有效!
安德鲁

86

您还可以使用以下unloadNamespace命令:

unloadNamespace("sqldf")

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


1
万一@kohske的解决方案也对您不起作用,这对我
有用


9

我尝试了kohske编写的答案,然后再次出现错误,所以我进行了一些搜索,发现这对我有用(R 3.0.2):

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

或者也

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

3
你得到什么错误?因为它对我有用(R 3.1)。第二种解决方案是@koshke的答案,只是没有卸载(因此不卸载程序包名称空间)。
alko989 2014年

我遇到了同样的错误。关键是我给了与@Kohske相同的解决方案,但包名不同。它只是意味着如果您使用该软件包:那么它应该可以正常工作,但是,如果您不使用它,则会得到与问题中相同的错误。;)
Mehrad Mahmoudian 2014年

等待...所以您尝试卸载一个甚至没有加载的软件包?您很惊讶您遇到了错误?
格雷戈尔·托马斯

@Gregor在按下下降投票按钮之前,请您再读一遍所有内容吗?!!!函数require()和library()几乎相同(在这种情况下,至少是这样),因此程序包已经加载!我对您缺乏信息不负责任!!
Mehrad Mahmoudian 2015年

8

在脚本之间来回移动时,有时仅需要卸载软件包。这是一条简单的IF语句,该语句将防止在尝试卸载当前未加载的程序包时出现警告。

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

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

希望您过得愉快!



3

您可以尝试使用所有要删除的软件包(及其附带的所有依赖项)来尝试删除,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

链接到截屏演示


2

我想添加一个替代解决方案。该解决方案不能直接回答您有关卸载软件包的问题,但是恕我直言,IMHO提供了一种更清洁的方法来实现您期望的目标,据我所知,它广泛地涉及避免名称冲突和尝试不同的功能,如下所述:

主要是因为当我尝试使用不同的,相互冲突的软件包时,重新启动R令人感到沮丧,但是可以想象,可以在程序中使用它来使用一个函数,然后再使用另一个函数-尽管命名空间引用可能是一种更好的用法

功能with_package通过提供withr包提供了可能:

将程序包附加到搜索路径,执行代码,然后从搜索路径中删除程序包。但是,程序包名称空间并未卸载。

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无法从全局名称空间访问示例中使用的示例。我认为与加载和卸载软件包相比,这可能是一种处理冲突的更干净的方法。


1

另请注意,您只能使用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


0

只需转到OUTPUT窗口,然后单击Packages图标(位于Plot和Help图标之间)。从要卸载的包中删除“ 打勾/复选标记 ”。

要再次使用该软件包,只需在软件包前面加上“ 打勾或复选标记 ”,或使用:

library (lme4)

1
除非您有自己的自定义库路径,否则不行。它没有显示在“包装”下,因此您必须执行上述方法
zazu

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.