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

时间:2011-08-08 09:12:45

标签: r package r-faq

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

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

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

detach(vegan)
  

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

detach("vegan")
  

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

那么如何卸载包呢?

12 个答案:

答案 0 :(得分:574)

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

答案 1 :(得分:70)

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

unloadNamespace("sqldf")

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

答案 2 :(得分:24)

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

答案 3 :(得分:8)

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

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

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

答案 4 :(得分:7)

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

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

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

我希望这能让你的一天充满希望!

答案 5 :(得分:6)

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

答案 6 :(得分:4)

您可以使用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 

Link to screen-cast demonstration

答案 7 :(得分:2)

请注意,您只能使用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 package(v0.3.0)于2020-05-09创建

答案 8 :(得分:1)

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

  

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

解决方案

通过with_package软件包提供的

函数withr提供了以下可能性:

  

将包附加到搜索路径,执行代码,然后从搜索路径中删除该包。但是,软件包名称空间是 not 卸载的。

示例

(require '[clojure.spec.alpha :as s]
         '[clojure.test       :as t])

; ===
; Specs
; ===

(s/def ::be-row-col
       (s/coll-of integer? :count 2 :kind sequential?))
(s/def ::be-square-matrix-size
       (s/and integer? #(<= 0 %)))
(s/def ::be-row-col-vector
       (s/and (s/coll-of ::be-row-col) (s/int-in-range? 0 5 #(count %))))

; ===
; Function of interest
; ===

(defn neighbors [sqmsz rc]

     {:pre  [(s/valid? ::be-row-col rc)
             (s/valid? ::be-square-matrix-size sqmsz)] 
      :post [(s/valid? ::be-row-col-vector %)]
     }

     (let [ cross             [[-1 0] [1 0] [0 -1] [0 1]]
            in-sq-matrix?     (fn [x]
                                  (and (<= 0 x) (< x sqmsz)))
            in-sq-matrix-rc?  (fn [rc]
                                  (every? in-sq-matrix? rc))
            add-two-rc        (fn [rc1 rc2]
                                  (vec (map + rc1 rc2)))
            get-rc-neighbors  (fn [rc]
                                  (map (partial add-two-rc rc) cross)) ]
        (filter in-sq-matrix-rc? (get-rc-neighbors rc))))

; ===
; Put a collection of [row col] into an expected form
; ===
; this is used to run the test code

(defn formify [rc-coll]
   (let [ cmp (fn [rc1 rc2]
                  (let [ [r1 c1] rc1
                         [r2 c2] rc2 ]
                     (cond (< r1 r2) -1  ; sort by row
                           (> r1 r2) +1
                           (< c1 c2) -1  ; then by column
                           (> c1 c2) +1
                           true       0))) ]
      (vec (sort cmp rc-coll))))

; ===
; Testing
; ===

(defn test-nb [ sqmsz rc expected txt ]
   (do
      (t/is (= (formify (neighbors sqmsz rc)) expected) txt)
   ))

(test-nb  0  [0 0]  []  "Zero-size matrix, outside #1")    
(test-nb  0  [1 1]  []  "Zero-size matrix, outside #2")    
(test-nb  1  [0 0]  []  "One-size matrix, inside")    
(test-nb  1  [1 0]  [[0 0]]  "One-size matrix, outside")    
(test-nb  5  [0 0]  [[0 1] [1 0]]  "Testing top left")    
(test-nb  5  [1 0]  [[0 0] [1 1] [2 0]]  "Testing left edge")    
(test-nb  5  [1 1]  [[0 1] [1 0] [1 2] [2 1]]  "Testing middle #1")    
(test-nb  5  [2 2]  [[1 2] [2 1] [2 3] [3 2]]  "Testing middle #2")    
(test-nb  5  [3 3]  [[2 3] [3 2] [3 4] [4 3]]  "Testing middle #3")    
(test-nb  5  [4 4]  [[3 4] [4 3]]  "Testing btm right")    
(test-nb  5  [5 5]  []  "Testing outside #1")    
(test-nb  5  [5 4]  [[4 4]]  "Testing outside #2")    
(test-nb  5  [4 3]  [[3 3] [4 2] [4 4]]  "Testing btm edge")
无法从全局名称空间访问示例中使用的

library(withr) with_package("ggplot2", { ggplot(mtcars) + geom_point(aes(wt, hp)) }) # Calling geom_point outside withr context exists("geom_point") # [1] FALSE 。我认为这可能是一种比加载和卸载程序包更干净的冲突处理方式。

答案 9 :(得分:0)

只需转到OUTPUT窗口,然后点击Packages图标(它位于 Plot和Help 图标之间)。删除&#34; 勾选/复选标记&#34;从您想要卸载的包中。

再次使用该套餐只需输入&#34; 勾选或勾选标记&#34;在包装或使用前:

library (lme4)

答案 10 :(得分:0)

另一个选择是

devtools::unload("your-package")

这显然也可以处理unloadNamespace()issue of registered S3 methods that are not removed

答案 11 :(得分:0)

很惊讶没人提到这个 R.utils::detachPackage("package")