tách tất cả các gói khi làm việc trong R


101

Trong khi làm việc để giải quyết một vấn đề khác, tôi gặp sự cố này:

Tôi có thể xóa tất cả các đối tượng R bằng cách:

rm(list = ls(all = TRUE))

Có lệnh tương đương có thể tách các gói đã cài đặt trong phiên làm việc không?

> sessionInfo()
R version 2.12.2 (2011-02-25)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base 

yêu cầu (ggplot2)

Loading required package: ggplot2
Loading required package: reshape
Loading required package: plyr

Attaching package: 'reshape'

The following object(s) are masked from 'package:plyr':

    round_any

Loading required package: grid
Loading required package: proto

sessionInfo ()

R version 2.12.2 (2011-02-25)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets  methods  
[8] base     

other attached packages:
[1] ggplot2_0.8.9 proto_0.3-9.1 reshape_0.8.4 plyr_1.4 

Tôi đã thử theo cách này, mặc dù ngay cả khi nó không hoạt động trong một giải pháp toàn cầu:

pkg <- c("package:ggplot2_0.8.9", "package:proto_0.3-9.1", "package:reshape_0.8.4",  "package:plyr_1.4")

 detach(pkg, character.only = TRUE)

Error in detach(pkg, character.only = TRUE) : invalid 'name' argument
In addition: Warning message:
In if (is.na(pos)) stop("invalid 'name' argument") :
  the condition has length > 1 and only the first element will be used

Những gì tôi đang tìm kiếm là một cái gì đó toàn cầu như:

  rm(list = ls(all = TRUE))

đối với các đối tượng, hy vọng nó sẽ không xóa các gói cơ sở đính kèm

cảm ơn;


3
Không phải câu hỏi của bạn không hợp lệ, nhưng tại sao không khởi động lại R?
Aaron trái Stack Overflow

5
@Aaron bởi vì bạn cũng không nên có ;-) Để vượt qua R CMD checkmột gói phải tự dỡ bỏ hoàn toàn, vì vậy R Core hy vọng điều này có thể thực hiện được và một cái gì đó người ta có thể muốn làm.
Gavin Simpson

@Aaron, tôi nghĩ rằng đôi khi nó có thể có ích để cho phiên đi khi một số gói đang gây ra hoặc có thể gây nhiễu, nhưng đã được sử dụng trong các bước trước đó ...
John Clark

5
Không thể trả R về một phương tiện chặn mới. Tôi đã nói chuyện với John Chambers về điều này và nó đặc biệt khó thực hiện đối với đăng ký lớp / phương thức S4.
hadley

Câu trả lời:


98

Vì vậy, ai đó đáng lẽ phải trả lời đơn giản như sau.

lapply(paste('package:',names(sessionInfo()$otherPkgs),sep=""),detach,character.only=TRUE,unload=TRUE)

(chỉnh sửa: 6-28-19) Trong phiên bản mới nhất của R 3.6.0, vui lòng sử dụng thay thế.

invisible(lapply(paste0('package:', names(sessionInfo()$otherPkgs)), detach, character.only=TRUE, unload=TRUE))

Lưu ý rằng việc sử dụng ẩn (*) là không cần thiết nhưng có thể hữu ích để ngăn trả lời NULL gửi thư rác theo chiều dọc cửa sổ R.

(chỉnh sửa: 20/9/2019) Trong phiên bản 3.6.1

Có thể hữu ích nếu chỉ chuyển đổi đã tải names(sessionInfo()$loadedOnly)sang các gói được đính kèm rõ ràng trước, sau đó tách các gói ra, như vậy.

lapply(names(sessionInfo()$loadedOnly), require, character.only = TRUE)
invisible(lapply(paste0('package:', names(sessionInfo()$otherPkgs)), detach, character.only=TRUE, unload=TRUE, force=TRUE))

Người ta có thể cố gắng dỡ các gói cơ sở qua $ basePkgs và cũng cố gắng sử dụng unloadNamespace(loadedNamespaces()). Tuy nhiên, chúng thường chứa đầy lỗi và có thể phá vỡ chức năng cơ bản, chẳng hạn như sessionInfo()chỉ trả về lỗi. Điều này thường xảy ra do thiếu khả năng đảo ngược trong thiết kế của gói ban đầu. timeDateVí dụ như hiện tại có thể phá vỡ không thể phục hồi.


3
Tôi nghĩ rằng điều này xứng đáng được ủng hộ vì tính đơn giản của nó và không cần các gói bổ sung.
Antonio Serrano

Điều này đã không làm việc cho tôi. Tôi chạy nó nhận được cảnh báo, sau đó chạy session.info () tất cả các gói vẫn ở đó.
dxander

1
Có trong phiên bản R 3.6.0 mới nhất, người ta nên sử dụng phần sau để thay thế. vô hình (lapply (paste0 ('gói:', tên (sessionInfo () $ otherPkgs)), tách, nhân vật.only = TRUE, dỡ bỏ = TRUE)) Lưu ý rằng việc sử dụng ẩn (*) là không bắt buộc nhưng có thể ngăn NULL trả lời từ spam dọc cửa sổ.
mmfrgmpds

Sử dụng invisible(lapply(paste0('package:', names(sessionInfo()$otherPkgs)), detach, character.only=TRUE, unload=TRUE))kết quả trong một Error in FUN(X[[i]], ...) : invalid 'name' argumentlỗi
dvanic

Lỗi Error in FUN(X[[i]], ...)...thường xuyên xảy ra khi chỉ có giá trị NULL. Người ta có thể kiểm tra điều này với names(sessionInfo()$otherPkgs). Nếu nó quay trở lại NULL, thì đây là nguyên nhân.
mmfrgmpds

57

Hãy thử cái này:

detachAllPackages <- function() {

  basic.packages <- c("package:stats","package:graphics","package:grDevices","package:utils","package:datasets","package:methods","package:base")

  package.list <- search()[ifelse(unlist(gregexpr("package:",search()))==1,TRUE,FALSE)]

  package.list <- setdiff(package.list,basic.packages)

  if (length(package.list)>0)  for (package in package.list) detach(package, character.only=TRUE)

}

detachAllPackages()

4
trong trường hợp khi bạn làm hỏng plyrdplyrcó vẻ như là cách duy nhất để đi. Cảm ơn!
JelenaČuklina

29

Bạn đã gần. Lưu ý những gì ?detachphải nói về đối số đầu tiên namecủa detach():

Tranh luận:

name: The object to detach.  Defaults to ‘search()[pos]’.  This can
      be an unquoted name or a character string but _not_ a
      character vector.  If a number is supplied this is taken as
      ‘pos’.

Vì vậy, chúng ta cần gọi nhiều detach()lần một lần cho mỗi phần tử của pkg. Có một số đối số khác mà chúng ta cần chỉ định để điều này hoạt động. Đầu tiên là character.only = TRUE, cho phép hàm giả sử đó namelà một chuỗi ký tự - nó sẽ không hoạt động nếu không có nó. Thứ hai, chúng tôi cũng có thể muốn dỡ bỏ bất kỳ không gian tên liên quan nào. Điều này có thể đạt được bằng cách thiết lập unload = TRUE. Vì vậy, giải pháp là, ví dụ:

pkg <- c("package:vegan","package:permute")
lapply(pkg, detach, character.only = TRUE, unload = TRUE)

Đây là một ví dụ đầy đủ:

> require(vegan)
Loading required package: vegan
Loading required package: permute
This is vegan 2.0-0
> sessionInfo()
R version 2.13.1 Patched (2011-09-13 r57007)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_GB.utf8       LC_NUMERIC=C             
 [3] LC_TIME=en_GB.utf8        LC_COLLATE=en_GB.utf8    
 [5] LC_MONETARY=C             LC_MESSAGES=en_GB.utf8   
 [7] LC_PAPER=en_GB.utf8       LC_NAME=C                
 [9] LC_ADDRESS=C              LC_TELEPHONE=C           
[11] LC_MEASUREMENT=en_GB.utf8 LC_IDENTIFICATION=C      

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods  
[7] base     

other attached packages:
[1] vegan_2.0-0   permute_0.7-0

loaded via a namespace (and not attached):
[1] grid_2.13.1     lattice_0.19-33 tools_2.13.1   
> pkg <- c("package:vegan","package:permute")
> lapply(pkg, detach, character.only = TRUE, unload = TRUE)
[[1]]
NULL

[[2]]
NULL

> sessionInfo()
R version 2.13.1 Patched (2011-09-13 r57007)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_GB.utf8       LC_NUMERIC=C             
 [3] LC_TIME=en_GB.utf8        LC_COLLATE=en_GB.utf8    
 [5] LC_MONETARY=C             LC_MESSAGES=en_GB.utf8   
 [7] LC_PAPER=en_GB.utf8       LC_NAME=C                
 [9] LC_ADDRESS=C              LC_TELEPHONE=C           
[11] LC_MEASUREMENT=en_GB.utf8 LC_IDENTIFICATION=C      

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods  
[7] base     

loaded via a namespace (and not attached):
[1] grid_2.13.1     lattice_0.19-33 tools_2.13.1

Nếu bạn muốn biến điều này thành một hàm, hãy nghiên cứu mã trong đó sessionInfo()để xem cách nó xác định những gì nó gắn nhãn là "các gói đính kèm khác:". Kết hợp đoạn mã đó với ý tưởng ở trên trong một chức năng duy nhất và bạn đang ở nhà và khô ráo. Tuy nhiên, tôi sẽ để lại điều đó cho bạn.


12
bạn có thể tự động hóa việc này bằng cách thêm pkgs = names(sessionInfo()$otherPkgs)pkgs = paste('package:', pkgs, sep = "")
Ramnath 21/09/11

2
@Ramnath +1 Thật vậy - nhưng tôi không muốn tỏ ra quá hữu ích ;-)
Gavin Simpson

4
Bạn cũng có thể muốn thêm force=TRUEtrong trường hợp các gói có phụ thuộc.
James

26

nothing

Có thể đáng để thêm giải pháp do Romain François cung cấp . Khi được tải, gói nothinghiện có trên GitHub , sẽ dỡ tất cả các gói đã tải; như trong ví dụ mà Romain cung cấp:

loadedNamespaces()
[1] "base"      "datasets"  "grDevices" "graphics"  "methods"   "stats"
[7] "utils"

require(nothing, quietly = TRUE)

loadedNamespaces()
[1] "base"

Cài đặt

Với việc sử dụng devtoolsgói:

devtools::install_github("romainfrancois/nothing")

pacman

Một cách tiếp cận thay thế sử dụng pacmangói có sẵn thông qua CRAN:

pacman::p_unload(pacman::p_loaded(), character.only = TRUE)

4
Nhìn vào họa tiết ( trinker.github.io/pacman/vignettes/Introduction_to_pacman.html ) có thể pacman::p_unload("all")cũng sẽ hoạt động?
chandler

10

Dựa trên câu trả lời của Gavin nhưng không hoàn toàn thành một chức năng đầy đủ sẽ là chuỗi sau:

sess.pkgs <- function (package = NULL) 
{   z <- list()
       if (is.null(package)) {
        package <- grep("^package:", search(), value = TRUE)
        keep <- sapply(package, function(x) x == "package:base" || 
            !is.null(attr(as.environment(x), "path")))
        package <- sub("^package:", "", package[keep])
    }
    pkgDesc <- lapply(package, packageDescription)
    if (length(package) == 0) 
        stop("no valid packages were specified")
    basePkgs <- sapply(pkgDesc, function(x) !is.null(x$Priority) && 
        x$Priority == "base")
    z$basePkgs <- package[basePkgs]
    if (any(!basePkgs)) {
        z$otherPkgs <-  package[!basePkgs]
    }
    z
}

lapply(paste("package:",sess.pkgs()$otherPkgs, sep=""), detach, 
                             character.only = TRUE, unload = TRUE)

2
bằng cách nào đó tôi có thể làm điều tương tự với một lớp lót lapply(paste("package:", names(sessionInfo()$otherPkgs), sep=""), detach, character.only = TRUE, unload = TRUE). Sẽ không bao giờ đạt được điều đó nếu không có câu trả lời của bạn!
Ufos

4

hoặc nếu bạn có RStudio, chỉ cần bỏ chọn tất cả các hộp đã chọn trong Tab Gói để tách


1
Nếu bạn có nhiều gói đã tải, việc bỏ chọn từng gói theo cách thủ công sẽ rất phức tạp.
Sibo Jiang

3
#Detach all  packages
detachAllPackages <- function() {

  basic.packages <- c("package:stats","package:graphics","package:grDevices","package:utils","package:datasets","package:methods","package:base")

  package.list <- search()[ifelse(unlist(gregexpr("package:",search()))==1,TRUE,FALSE)]

  package.list <- setdiff(package.list,basic.packages)

  if (length(package.list)>0)  for (package in package.list) detach(package, character.only=TRUE)

}

detachAllPackages()

điều này sẽ đảm bảo tất cả các gói được tách rời khỏi các gói cơ bản của bạn


Câu trả lời này khác với câu trả lời của @mjaniec như thế nào
StupidWolf

1

Hầu hết các lần là vấn đề plyrvs. dplyrSử dụng điều này ở đầu mã:

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

Vì vậy, bất cứ khi nào tập lệnh chạy, nó sẽ xóa plyrgói


0

nếu bạn đang gặp sự cố với các gói có các chức năng được đặt tên tương tự xung đột với nhau, bạn luôn có thể tham chiếu không gian tên của gói mà chức năng bạn muốn.

pkg_name::function_i_want()

Đây là nhận xét thay vì một câu trả lời cho câu hỏi được hỏi.
Sibo Jiang

Giả sử tôi nên đặt điều này làm nhận xét cho câu trả lời plyr v. Dplyr trước đó, có thể di chuyển nó không? Tôi vẫn đang học các quy ước ở đây.
M. Wood

0

Kết hợp các bit từ các câu trả lời khác nhau đã đưa ra giải pháp mạnh mẽ nhất mà tôi có thể tìm thấy ...

packs <- c(names(sessionInfo()$otherPkgs), names(sessionInfo()$loadedOnly))
if(length(packs) > 0){ 
  message('Unloading packages -- if any problems occur, please try this from a fresh R session')
  while(length(packs) > 0){
    newpacks <- c()
    for(packi in 1:length(packs)){
      u=try(unloadNamespace(packs[packi]))
      if(class(u) %in% 'try-error') newpacks <- c(newpacks,packs[packi])
    }
    packs <- newpacks
    Sys.sleep(.1)
  }
}
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.