Cara membongkar paket tanpa memulai ulang R

540

Saya ingin membongkar sebuah paket tanpa harus me-restart R (kebanyakan karena me-restart R ketika saya mencoba berbeda, paket-paket yang saling bertentangan semakin membuat frustrasi, tetapi mungkin ini dapat digunakan dalam suatu program untuk menggunakan satu fungsi dan kemudian yang lain - walaupun namespace referensi mungkin adalah ide yang lebih baik untuk penggunaan itu).

?library tidak menunjukkan opsi apa pun yang akan menurunkan paket.

Ada saran yang detachdapat menurunkan paket, tetapi berikut ini keduanya gagal:

detach(vegan)

Galat dalam detach(vegan): nameargumen tidak valid

detach("vegan")

Galat dalam detach("vegan"): nameargumen tidak valid

Jadi bagaimana saya membongkar paket?

Ari B. Friedman
sumber
4
@Iterator: Perpustakaan adalah lokasi di mana Anda menemukan paket. (Mereka tidak identik.) .libPaths()Memberi Anda jalan ke semua perpustakaan di sistem Anda.
Richie Cotton
16
@Richie: Terima kasih. Saya mendapatkan itu dalam konteks R, tapi saya merasa bahwa penggunaan R berlebihan atau membuat ambiguitas istilah librarydalam dua cara: 1 - itu bukan penggunaan yang sama libraryseperti di tempat lain, dan 2 - istilah ini digunakan library()untuk memuat ... bukan perpustakaan, tetapi sebuah paket.
Iterator
2
@ Isator Anda benar. Ini adalah jawaban yang saya butuhkan, dan ketika googling saya menggunakan "kebalikan dari require" atau "membatalkan library" karena itulah bagaimana saya biasanya memuat, erm, "paket". Jadi, titling dengan benar membuat pertanyaan lebih benar tetapi juga lebih sulit ditemukan.
isomorfisma

Jawaban:

656

Coba ini (lihat ?detachuntuk lebih jelasnya):

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

Dimungkinkan untuk memiliki beberapa versi paket dimuat sekaligus (misalnya, jika Anda memiliki versi pengembangan dan versi stabil di perpustakaan yang berbeda). Untuk menjamin bahwa semua salinan terlepas, gunakan fungsi ini.

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

Penggunaannya, misalnya

detach_package(vegan)

atau

detach_package("vegan", TRUE)
kohske
sumber
3
@Hadley Memang. Versi yang tidak dikutip tampaknya tidak berfungsi dalam versi terbaru R. Saya telah memperbarui jawaban kohske untuk mencerminkan solusi Anda.
Ari B. Friedman
1
@ AriB.Friedman, sekarang sebagai pertanyaan .
Eric Fail
1
> detach("package:MASS", unload=TRUE) Error in detach("package:MASS", unload = TRUE) : invalid 'name' argument
Mona Jalal
5
Jika Anda mendapatkan kesalahan argumen 'nama' yang tidak valid, tambahkan character.only = TRUE.
Dan Tenenbaum
2
> detach ("package: kriging", unload = TRUE, character.only = T) Kesalahan dalam detach ("package: kriging", unload = TRUE, character.only = T): argumen 'name' tidak valid. Namun solusi @rstober berhasil!
Andrew
86

Anda juga dapat menggunakan unloadNamespaceperintah, seperti pada:

unloadNamespace("sqldf")

Fungsi ini melepaskan namespace sebelum membongkar.

rstober
sumber
1
Dalam hal solusi @ kohske juga tidak bekerja untuk Anda, ini bekerja untuk saya
Wassadamo
29

Anda dapat menghapus centang pada tombol kotak centang di RStudio (paket).

Panel paket RStudio

Ajay Ohri
sumber
16
Perlu ditambahkan bahwa ini menghasilkan detach("package:packageToUnload", unload=TRUE)perintah yang dieksekusi dan tidak berbeda dengan solusi yang sudah diusulkan.
Konrad
2
Juga, kotak tidak dicentang jika paket dimuat menggunakan rstudio instal & restart (bug?). Tapi Anda bisa mengecek dan menghapus centangnya.
jiggunjer
9

Saya mencoba apa yang kohske tulis sebagai jawaban dan saya mendapatkan kesalahan lagi, jadi saya melakukan pencarian dan menemukan ini yang berfungsi untuk saya (R 3.0.2):

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

atau juga

library(splines)
pkg <- "package:splines"
detach(pkg, character.only = TRUE)
Mehrad Mahmoudian
sumber
3
Kesalahan apa yang Anda dapatkan? Karena itu bekerja untuk saya (R 3.1). Dan solusi kedua adalah jawaban @ koshke yang sama, hanya tanpa membongkar (jadi paket namespace tidak diturunkan).
alko989
Saya mendapat kesalahan yang sama. intinya adalah saya memberikan solusi yang sama dengan @ Kohske tetapi dengan nama paket yang berbeda. itu hanya berarti bahwa jika Anda menggunakan paket: maka itu akan berfungsi dengan baik, tetapi jika Anda tidak menggunakannya, Anda akan mendapatkan kesalahan yang sama seperti dalam pertanyaan. ;)
Mehrad Mahmoudian
Tunggu ... jadi Anda mencoba membongkar paket yang bahkan tidak dimuat? Dan Anda terkejut Anda mendapat kesalahan?
Gregor Thomas
@Gregor Maukah Anda membaca lagi semuanya sebelum menekan tombol downvote? !!! fungsi memerlukan () dan perpustakaan () hampir melakukan hal yang sama (minimal dalam hal ini), sehingga paket sudah dimuat !! Saya tidak bertanggung jawab atas kurangnya informasi !!
Mehrad Mahmoudian
8

Saat Anda bolak-balik di antara skrip, terkadang hanya perlu membongkar sebuah paket. Berikut adalah pernyataan IF sederhana yang akan mencegah peringatan yang akan muncul jika Anda mencoba membongkar paket yang saat ini tidak dimuat.

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

Memasukkan ini di bagian atas skrip mungkin bermanfaat.

Saya harap itu membuat hari Anda!

dca
sumber
8

detach(package:PackageName) berfungsi dan tidak perlu menggunakan kutipan.

Alper Gur
sumber
3

Anda dapat mencoba semua yang ingin Anda hapus paket (dan semua dependensi yang dibawanya bersama) menggunakan unloadNamespace()tetapi jejak memori masih akan tetap ada. Dan tidak, detach("package:,packageName", unload=TRUE, force = TRUE)tidak akan berhasil juga.

Dari konsol baru yang baru atau Session > Restart Rperiksa memori dengan pryrpaket:

pryr::mem_used()

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

Periksa saya 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   

Mari memuat Seuratpaket dan memeriksa jejak memori baru :

library(Seurat)
pryr::mem_used()

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

Mari kita gunakan unloadNamespace()untuk menghapus semuanya:

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

Sekarang periksa 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 

Periksa jejak memori :

pryr::mem_used()

# 173 MB

Tautan ke demonstrasi pemeran layar

Matthew J. Oldach
sumber
2

Saya ingin menambahkan solusi alternatif. Solusi ini tidak secara langsung menjawab pertanyaan Anda tentang menurunkan paket tetapi, IMHO, memberikan alternatif yang lebih bersih untuk mencapai tujuan yang Anda inginkan, yang saya mengerti, secara luas berkaitan dengan menghindari konflik nama dan mencoba berbagai fungsi, seperti yang dinyatakan:

sebagian besar karena me-restart R ketika saya mencoba paket yang berbeda dan saling bertentangan semakin membuat frustrasi, tetapi bisa dibayangkan ini dapat digunakan dalam suatu program untuk menggunakan satu fungsi dan kemudian yang lain - walaupun referensi namespace mungkin adalah ide yang lebih baik untuk penggunaan itu

Larutan

Fungsi yang with_packageditawarkan melalui withrpaket menawarkan kemungkinan untuk:

atur paket ke jalur pencarian, jalankan kode, lalu hapus paket dari jalur pencarian. Namun, namespace paket tidak diturunkan.

Contoh

library(withr)
with_package("ggplot2", {
  ggplot(mtcars) + geom_point(aes(wt, hp))
})
# Calling geom_point outside withr context 
exists("geom_point")
# [1] FALSE

geom_pointdigunakan dalam contoh ini tidak dapat diakses dari namespace global. Saya rasa ini mungkin cara yang lebih baik untuk menangani konflik daripada memuat dan membongkar paket.

Konrad
sumber
1

Perhatikan juga bahwa Anda hanya dapat menggunakan unload()satu kali. Jika Anda menggunakannya untuk kedua kalinya tanpa menjalankan ulang library(), Anda akan mendapatkan argumen 'nama' pesan kesalahan yang tidak terlalu informatif :

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

Dibuat pada 2020-05-09 oleh paket reprex (v0.3.0)

Matifou
sumber
0

Cukup buka jendela OUTPUT, lalu klik ikon Paket (ini terletak di antara Plot dan ikon Bantuan ). Hapus " centang / centang " dari paket yang Anda inginkan diturunkan.

Untuk menggunakan kembali paket tersebut, cukup beri tanda " centang atau centang " di depan paket atau gunakan:

library (lme4)
EsKe
sumber
1
Tidak, kecuali jika Anda memiliki jalur perpustakaan khusus Anda sendiri. Itu tidak muncul di bawah "Paket" sehingga Anda harus melakukan metode di atas
zazu