Cách dỡ gói mà không cần khởi động lại R


540

Tôi muốn dỡ gói mà không phải khởi động lại R (chủ yếu là vì khởi động lại R khi tôi thử các gói khác nhau, xung đột đang trở nên khó chịu, nhưng có thể hiểu rằng điều này có thể được sử dụng trong một chương trình để sử dụng một chức năng và sau đó là một không gian tên tham khảo có lẽ là một ý tưởng tốt hơn cho việc sử dụng đó).

?library không hiển thị bất kỳ tùy chọn nào sẽ dỡ gói.

Có một gợi ý rằng detachcó thể dỡ bỏ gói, nhưng sau cả hai thất bại:

detach(vegan)

Lỗi trong detach(vegan): nameđối số không hợp lệ

detach("vegan")

Lỗi trong detach("vegan"): nameđối số không hợp lệ

Vì vậy, làm thế nào để tôi dỡ một gói?


4
@Iterator: Thư viện là một vị trí nơi bạn tìm thấy các gói. (Chúng không đồng nghĩa.) .libPaths()Cung cấp cho bạn đường dẫn đến tất cả các thư viện trên hệ thống của bạn.
Bông Richie

16
@Richie: Cảm ơn. Tôi hiểu điều đó trong ngữ cảnh R, nhưng tôi cảm thấy rằng việc sử dụng R quá tải hoặc làm cho thuật ngữ này trở nên mơ hồ librarytheo hai cách: 1 - nó không được sử dụng librarygiống như ở nơi khác và 2 - thuật ngữ được sử dụng library()để tải ... không phải là một thư viện, nhưng một gói.
Lặp lại

2
@Iterator Bạn nói đúng. Đây là câu trả lời tôi cần và khi tôi sử dụng "ngược lại require" hoặc "hoàn tác library" bởi vì đó là cách tôi thường tải, erm, "gói". Vì vậy, tiêu đề đúng cách làm cho câu hỏi chính xác hơn nhưng cũng khó tìm hơn.
đẳng cấu

Câu trả lời:


656

Hãy thử điều này (xem ?detachđể biết thêm chi tiết):

detach("package:vegan", unload=TRUE)

Có thể tải nhiều phiên bản của một gói (ví dụ: nếu bạn có phiên bản phát triển và phiên bản ổn định trong các thư viện khác nhau). Để đảm bảo rằng tất cả các bản sao được tách ra, sử dụng chức năng này.

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

Cách sử dụng là, ví dụ

detach_package(vegan)

hoặc là

detach_package("vegan", TRUE)

3
@hadley Thật vậy. Phiên bản không được trích dẫn dường như không hoạt động trong phiên bản mới nhất của R. Tôi đã cập nhật câu trả lời của kohske để phản ánh giải pháp của bạn.
Ari B. Friedman

1
@ AriB.Friedman, bây giờ là một câu hỏi .
Eric Fail

1
> detach("package:MASS", unload=TRUE) Error in detach("package:MASS", unload = TRUE) : invalid 'name' argument
Mona Jalal

5
Nếu bạn gặp lỗi đối số 'name' không hợp lệ, hãy thêm character.only = TRUE.
Dan Tenenbaum

2
> tách ra ("gói: kriging", unload = TRUE, character.only = T) Lỗi khi tách ("gói: kriging", unload = TRUE, character.only = T): đối số 'name' không hợp lệ. Tuy nhiên giải pháp @rstober không hoạt động!
Andrew

86

Bạn cũng có thể sử dụng unloadNamespacelệnh, như trong:

unloadNamespace("sqldf")

Hàm này tách không gian tên trước khi dỡ nó.


1
Trong trường hợp giải pháp của @ kohske cũng không hiệu quả với bạn, thì giải pháp này hiệu quả với tôi
Wassadamo

29

Bạn có thể bỏ chọn nút hộp kiểm trong RStudio (gói).

Khung gói RStudio


16
Điều đáng nói là điều này dẫn đến một detach("package:packageToUnload", unload=TRUE)lệnh được thực thi và không khác gì với giải pháp đã được đề xuất.
Konrad

2
Ngoài ra, hộp không được kiểm tra nếu gói được tải bằng rstudio install & restart (bug?). Nhưng bạn chỉ có thể kiểm tra và bỏ chọn nó.
jiggunjer

9

Tôi đã thử những gì kohske đã viết như một câu trả lời và tôi lại gặp lỗi, vì vậy tôi đã thực hiện một số tìm kiếm và tìm thấy cái này hiệu quả với tôi (R 3.0.2):

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

hoặc cũng

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

3
lỗi gì bạn nhận được? Bởi vì nó hoạt động với tôi (R 3.1). Và giải pháp thứ hai là cùng một câu trả lời của @ koshke, chỉ khi không dỡ tải (vì vậy không gian tên gói không được tải).
alko989

Tôi đã nhận được cùng một lỗi. vấn đề là tôi đã đưa ra giải pháp tương tự như @Kohske nhưng với tên gói khác nhau. nó đơn giản có nghĩa là nếu bạn sử dụng gói: nó sẽ hoạt động tốt, nhưng nếu bạn không sử dụng gói đó, bạn sẽ gặp lỗi tương tự như trong câu hỏi. ;)
Mehrad Mahmoudian

Đợi đã ... vì vậy bạn đã cố gắng dỡ một gói thậm chí không được tải? Và bạn có ngạc nhiên khi bạn gặp lỗi không?
Gregor Thomas

@Gregor Bạn vui lòng đọc lại mọi thứ trước khi nhấn nút downvote? !!! hàm yêu cầu () và thư viện () gần như làm như vậy (ít nhất trong trường hợp này), vì vậy gói đã được tải !! Tôi không chịu trách nhiệm cho bạn thiếu thông tin !!
Mehrad Mahmoudian

8

Khi bạn đang quay đi quay lại giữa các tập lệnh, đôi khi có thể chỉ cần dỡ gói. Đây là một câu lệnh IF đơn giản sẽ ngăn các cảnh báo sẽ xuất hiện nếu bạn cố gắng dỡ một gói hiện không được tải.

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

Bao gồm điều này ở đầu một kịch bản có thể hữu ích.

Tôi hy vọng điều đó làm cho ngày của bạn!


8

detach(package:PackageName) hoạt động và không cần sử dụng dấu ngoặc kép.


3

Bạn có thể thử tất cả những gì bạn muốn loại bỏ một gói (và tất cả các phụ thuộc mà nó mang theo) bằng cách sử dụng unloadNamespace()nhưng dấu chân bộ nhớ sẽ vẫn còn. Và không,detach("package:,packageName", unload=TRUE, force = TRUE) sẽ không hoạt động.

Từ bảng điều khiển mới hoặc Session > Restart Rkiểm tra bộ nhớ với pryrgói:

pryr::mem_used()

# 40.6 MB   ## This will depend on which packages are loaded obviously (can also fluctuate a bit after the decimal)

Kiểm tra của tôi 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   

Hãy tải Seuratgói và kiểm tra dung lượng bộ nhớ mới :

library(Seurat)
pryr::mem_used()

# 172 MB    ## Likely to change in the future but just to give you an idea

Hãy sử dụng unloadNamespace()để xóa mọi thứ:

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

Bây giờ hãy kiểm tra 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 

Kiểm tra dấu chân bộ nhớ :

pryr::mem_used()

# 173 MB

Liên kết đến trình diễn màn hình


2

Tôi muốn thêm một giải pháp thay thế. Giải pháp này không trả lời trực tiếp câu hỏi của bạn về việc dỡ gói hàng, nhưng IMHO, cung cấp một giải pháp thay thế sạch hơn để đạt được mục tiêu mong muốn của bạn, mà tôi hiểu, quan tâm rộng rãi đến việc tránh xung đột tên và thử các chức năng khác nhau, như đã nêu:

chủ yếu là vì khởi động lại R khi tôi thử các gói khác nhau, xung đột đang trở nên khó chịu, nhưng có thể hiểu rằng điều này có thể được sử dụng trong một chương trình để sử dụng một chức năng và sau đó là một chức năng khác - mặc dù tham chiếu không gian tên có lẽ là một ý tưởng tốt hơn cho việc sử dụng đó

Giải pháp

Chức năng with_packageđược cung cấp thông qua withrgói cung cấp khả năng:

tùy chỉnh một gói vào đường dẫn tìm kiếm, thực thi mã, sau đó xóa gói khỏi đường dẫn tìm kiếm. Không gian tên gói là không bốc dỡ, tuy nhiên.

Thí dụ

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được sử dụng trong ví dụ không thể truy cập từ không gian tên toàn cầu. Tôi cho rằng nó có thể là một cách xử lý xung đột sạch hơn so với tải và dỡ gói.


1

Cũng lưu ý rằng bạn chỉ có thể sử dụng unload()một lần. Nếu bạn sử dụng nó lần thứ hai mà không chạy lại library(), bạn sẽ nhận được đối số ' thông tin lỗi không có nhiều thông tin không hợp lệ :

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

Được tạo vào ngày 2020-05-09 bởi gói reprex (v0.3.0)


0

Chỉ cần đi đến cửa sổ OUTPUT, sau đó nhấp vào biểu tượng Gói (nó nằm giữa biểu tượng Lô và Trợ giúp ). Xóa " đánh dấu / đánh dấu " khỏi gói bạn muốn được dỡ xuống.

Để sử dụng lại gói, chỉ cần đặt " đánh dấu hoặc Dấu kiểm " trước gói hoặc sử dụng:

library (lme4)

1
Không trừ khi bạn có đường dẫn thư viện tùy chỉnh của riêng bạn. Nó không hiển thị dưới "Gói", do đó bạn phải thực hiện các phương pháp trên
zemo

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.