lepaskan semua paket saat bekerja di R


101

Saat bekerja untuk memecahkan masalah lain saya mendapat masalah ini:

Saya dapat menghapus semua objek R dengan:

rm(list = ls(all = TRUE))

Apakah ada perintah yang setara yang dapat melepaskan paket yang diinstal selama sesi kerja?

> 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 

membutuhkan (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 

Saya mencoba cara ini, meskipun itu berhasil bukan solusi global:

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

Apa yang saya cari adalah sesuatu yang global seperti:

  rm(list = ls(all = TRUE))

untuk objek, berharap itu tidak akan menghapus paket dasar yang terpasang

Terima kasih;


3
Bukannya pertanyaan Anda tidak valid, tapi mengapa tidak restart R saja?
Aaron meninggalkan Stack Overflow

5
@Aaron karena Anda seharusnya tidak perlu terlalu ;-) Untuk mengoper R CMD checkpaket seharusnya membongkar sendiri dengan bersih, jadi R Core berharap ini mungkin dan sesuatu yang mungkin ingin dilakukan.
Gavin Simpson

@ Aaron, saya pikir kadang-kadang mungkin berguna untuk membiarkan sesi berjalan ketika beberapa paket menyebabkan atau mungkin menyebabkan gangguan, tetapi digunakan dalam langkah sebelumnya ...
John Clark

5
Tidak mungkin mengembalikan R ke batu tulis baru. Saya telah berbicara dengan John Chambers tentang hal ini, dan ini sangat sulit dilakukan untuk pendaftaran kelas / metode S4.
hadley

Jawaban:


98

Jadi, seseorang seharusnya hanya menjawab yang berikut ini.

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

(edit: 6-28-19) Di versi terbaru R 3.6.0, gunakan saja.

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

Perhatikan bahwa penggunaan invisible (*) tidak diperlukan tetapi dapat berguna untuk mencegah balasan NULL dari spamming secara vertikal ke jendela R.

(edit: 20/9/2019) Dalam versi 3.6.1

Mungkin berguna untuk mengonversi yang dimuat hanya names(sessionInfo()$loadedOnly)ke paket yang dilampirkan secara eksplisit terlebih dahulu, dan kemudian melepaskan paket, jika demikian.

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

Seseorang dapat mencoba untuk membongkar paket dasar melalui $ basePkgs dan juga mencoba menggunakan unloadNamespace(loadedNamespaces()). Namun ini biasanya penuh dengan kesalahan dan dapat merusak fungsionalitas dasar seperti menyebabkan sessionInfo()hanya mengembalikan kesalahan. Ini biasanya terjadi karena kurangnya pembalikan dalam desain paket asli. Saat ini timeDatedapat rusak secara permanen, misalnya.


3
Saya pikir ini layak mendapat suara positif karena kesederhanaannya dan tidak memerlukan paket tambahan.
Antonio Serrano

Ini tidak berhasil untuk saya. Saya menjalankannya mendapat peringatan, lalu menjalankan session.info () semua paket masih ada.
dxander

1
Ya di versi terbaru R 3.6.0 orang harus menggunakan yang berikut ini. invisible (lapply (paste0 ('package:', names (sessionInfo () $ otherPkgs)), detach, character.only = TRUE, unload = TRUE)) Catatan penggunaan invisible (*) tidak diperlukan tetapi dapat mencegah NULL membalas dari spamming jendela secara vertikal.
mmfrgmpds

Menggunakan invisible(lapply(paste0('package:', names(sessionInfo()$otherPkgs)), detach, character.only=TRUE, unload=TRUE))hasil dalam Error in FUN(X[[i]], ...) : invalid 'name' argumentkesalahan
dvanic

Kesalahan Error in FUN(X[[i]], ...)...sering terjadi ketika hanya ada nilai NULL. Seseorang dapat menguji ini dengan names(sessionInfo()$otherPkgs). Jika kembali NULL, maka inilah penyebabnya.
mmfrgmpds

57

Silakan coba ini:

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
dalam kasus ketika Anda mengacaukan plyr& dplyrtampaknya satu-satunya cara untuk pergi. Terima kasih!
JelenaČuklina

29

Anda sudah dekat. Perhatikan apa yang ?detachharus dikatakan tentang argumen pertama namedari detach():

Argumen:

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’.

Jadi kita perlu memanggil berulang kali detach()satu kali per elemen pkg. Ada beberapa argumen lain yang perlu kami tentukan agar ini berfungsi. Yang pertama adalah character.only = TRUE, yang memungkinkan fungsi menganggap itu namesebagai string karakter - ini tidak akan berfungsi tanpanya. Kedua, kami juga mungkin ingin membongkar namespace terkait. Ini dapat dicapai dengan pengaturan unload = TRUE. Jadi solusinya misalnya:

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

Berikut contoh lengkapnya:

> 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

Jika Anda ingin mengubahnya menjadi sebuah fungsi, pelajari kode sessionInfo()untuk melihat bagaimana kode tersebut mengidentifikasi apa yang dilabeli sebagai "paket terlampir lainnya:". Gabungkan sedikit kode itu dengan ide di atas dalam satu fungsi dan Anda sudah di rumah dan kering. Aku akan menyerahkan sedikit itu padamu.


12
Anda dapat mengotomatiskannya dengan menambahkan pkgs = names(sessionInfo()$otherPkgs)danpkgs = paste('package:', pkgs, sep = "")
Ramnath

2
@Ramnath +1 Memang - tapi saya tidak ingin terlalu membantu ;-)
Gavin Simpson

4
Anda mungkin juga ingin menambahkan force=TRUEjika paket memiliki ketergantungan.
James

26

nothing

Mungkin ada baiknya untuk menambahkan solusi yang disediakan oleh Romain François . Saat memuat paket nothing, yang saat ini tersedia di GitHub , akan membongkar semua paket yang dimuat; seperti pada contoh yang diberikan Romain:

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

require(nothing, quietly = TRUE)

loadedNamespaces()
[1] "base"

Instalasi

Dengan menggunakan devtoolspaket:

devtools::install_github("romainfrancois/nothing")

pacman

Pendekatan alternatif menggunakan pacmanpaket yang tersedia melalui CRAN:

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

4
Melihat vignette ( trinker.github.io/pacman/vignettes/Introduction_to_pacman.html ) mungkin pacman::p_unload("all")akan bekerja juga?
Chandler

10

Berdasarkan jawaban Gavin tetapi tidak sepenuhnya berfungsi penuh adalah urutan berikut:

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
entah bagaimana saya bisa melakukan hal yang sama dengan satu baris lapply(paste("package:", names(sessionInfo()$otherPkgs), sep=""), detach, character.only = TRUE, unload = TRUE). Tidak akan pernah sampai di sana tanpa jawaban Anda!
Ufos

4

atau jika Anda memiliki RStudio, cukup hapus centang semua kotak yang dicentang di Tab Paket untuk melepaskannya


1
Jika Anda memiliki banyak paket yang dimuat, akan merepotkan untuk menghapus centang setiap paket secara manual.
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()

ini akan memastikan semua paket terlepas dari paket dasar Anda


Bagaimana ini berbeda dari jawaban
@mjaniec

1

Sering kali ini adalah masalah plyrvs. dplyrGunakan ini di awal kode:

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

Jadi, setiap kali skrip dijalankan, plyrpaket akan dihapus


0

jika Anda mengalami masalah dengan paket yang memiliki fungsi bernama serupa yang saling bertentangan, Anda selalu dapat mereferensikan namespace dari paket yang fungsinya Anda inginkan.

pkg_name::function_i_want()

Ini adalah komentar, bukan jawaban atas pertanyaan yang diajukan.
Sibo Jiang

Misalkan saya harus menetapkan ini sebagai komentar ke jawaban plyr v. Dplyr sebelumnya, apakah mungkin untuk memindahkannya? Saya masih mempelajari konvensi di sini.
M. Wood

0

Menggabungkan bit dari berbagai jawaban memberikan solusi paling kuat yang dapat saya temukan ...

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)
  }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.