วิธีการยกเลิกการโหลดแพคเกจโดยไม่ต้องรีสตาร์ท R


540

ฉันต้องการยกเลิกการโหลดแพคเกจโดยไม่ต้องรีสตาร์ท R (ส่วนใหญ่เป็นเพราะการรีสตาร์ท R เนื่องจากฉันลองใช้แพ็คเกจที่ขัดแย้งกันต่าง ๆ กำลังทำให้หงุดหงิด แต่สิ่งนี้สามารถใช้ในโปรแกรมเพื่อใช้ฟังก์ชันหนึ่งและอีกอัน - แม้ว่า namespace การอ้างอิงอาจเป็นแนวคิดที่ดีกว่าสำหรับการใช้งานนั้น)

?library ไม่แสดงตัวเลือกที่จะยกเลิกการโหลดแพ็คเกจ

มีข้อเสนอแนะที่detachสามารถยกเลิกการโหลดแพคเกจ แต่ต่อไปนี้ทั้งสองล้มเหลว:

detach(vegan)

ข้อผิดพลาดในdetach(vegan): nameอาร์กิวเมนต์ไม่ถูกต้อง

detach("vegan")

ข้อผิดพลาดในdetach("vegan"): nameอาร์กิวเมนต์ไม่ถูกต้อง

ดังนั้นฉันจะยกเลิกการโหลดแพ็คเกจได้อย่างไร


4
@Iterator: ไลบรารีคือตำแหน่งที่คุณค้นหาแพ็คเกจ (มันไม่ได้มีความหมายเหมือนกัน) .libPaths()ให้เส้นทางแก่ไลบรารีทั้งหมดในระบบของคุณ
Richie Cotton

16
@ Richie: ขอบคุณ ฉันได้สิ่งนั้นในบริบท R แต่ฉันรู้สึกว่าการใช้ R มากเกินไปหรือทำให้คำที่คลุมเครือlibraryในสองวิธี: 1 - มันไม่ใช่การใช้แบบเดียวกันlibraryกับที่อื่นและ 2 - คำนี้ใช้ในlibrary()การโหลด ... ไม่ใช่ ไลบรารี่ แต่เป็นแพ็คเกจ
Iterator

2
@Iterator คุณพูดถูก นี่คือคำตอบที่ฉันต้องการและเมื่อ googling ฉันใช้ "ตรงกันข้ามrequire" หรือ "เลิกทำlibrary" เพราะนั่นคือวิธีที่ฉันโหลดทั่วไป, erm, "แพ็คเกจ" ดังนั้นการตั้งชื่อให้ถูกต้องจะทำให้คำถามนั้นถูกต้องมากขึ้น
isomorphismes

คำตอบ:


656

ลองนี้ (ดู?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)

3
@Hadley แน่นอน ดูเหมือนว่าเวอร์ชั่นที่ไม่ได้ยกมาจะไม่ทำงานใน R. เวอร์ชันล่าสุดฉันได้อัปเดตคำตอบของ kohske เพื่อให้สะท้อนถึงวิธีแก้ปัญหาของคุณแล้ว
Ari B. Friedman

1
@ AriB.Friedman ตอนนี้เป็นคำถาม
Eric Fail

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

5
หากคุณได้รับข้อผิดพลาดการโต้แย้ง 'ชื่อ' ไม่ถูกต้องเพิ่ม character.only = TRUE
Dan Tenenbaum

2
> detach ("package: kriging", unload = TRUE, character.only = T) ข้อผิดพลาดในการแยกออก ("package: kriging", unload = TRUE, character.only = T): อาร์กิวเมนต์ 'ชื่อ' ไม่ถูกต้อง อย่างไรก็ตามวิธีการแก้ปัญหา @rstober ทำงาน!
แอนดรู

86

คุณยังสามารถใช้unloadNamespaceคำสั่งดังเช่นใน:

unloadNamespace("sqldf")

ฟังก์ชันจะลบเนมสเปซก่อนที่จะยกเลิกการโหลด


1
ในกรณีที่วิธีแก้ปัญหาของ @ kohske ไม่ได้ผลสำหรับคุณสิ่งนี้ใช้ได้กับฉัน
Wassadamo

29

คุณสามารถยกเลิกการเลือกปุ่มช่องทำเครื่องหมายใน RStudio (แพ็คเกจ)

บานหน้าต่างแพคเกจ RStudio


16
เป็นมูลค่าเพิ่มว่าผลลัพธ์นี้ในdetach("package:packageToUnload", unload=TRUE)คำสั่งจะถูกดำเนินการและไม่แตกต่างจากการแก้ปัญหาที่เสนอแล้ว
Konrad

2
นอกจากนี้จะไม่ทำเครื่องหมายในช่องนี้หากมีการโหลดแพคเกจโดยใช้ rstudio install & restart (ข้อผิดพลาด?) แต่คุณสามารถตรวจสอบและยกเลิกการเลือกได้
jiggunjer

9

ฉันลองสิ่งที่ kohske เขียนไว้เป็นคำตอบและฉันได้รับข้อผิดพลาดอีกครั้งดังนั้นฉันจึงทำการค้นหาและพบสิ่งนี้ที่ใช้งานได้สำหรับฉัน (R 3.0.2):

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

หรือยัง

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

3
คุณได้รับข้อผิดพลาดอะไร เพราะมันใช้งานได้สำหรับฉัน (R 3.1) และทางออกที่สองคือคำตอบของ @ koshke เดียวกันโดยไม่ต้องถอดออกเท่านั้น (ดังนั้นแพ็คเกจเนมสเปซจะไม่ถูกยกเลิกการโหลด)
alko989

ฉันได้รับข้อผิดพลาดเดียวกัน ประเด็นคือฉันได้แก้ปัญหาเช่นเดียวกับ @Kohske แต่มีชื่อแพคเกจที่แตกต่างกัน มันก็หมายความว่าถ้าคุณใช้แพคเกจ: แล้วมันควรจะทำงานได้ดี แต่ถ้าคุณไม่ได้ใช้มันคุณจะได้รับข้อผิดพลาดเช่นเดียวกับในคำถาม ;)
Mehrad Mahmoudian

เดี๋ยวก่อน ... ดังนั้นคุณลองยกเลิกการโหลดแพ็คเกจที่ไม่ได้โหลดเลย และคุณประหลาดใจที่คุณมีข้อผิดพลาดหรือไม่?
Gregor Thomas

@ Gregor คุณช่วยอ่านอีกครั้งก่อนกดปุ่ม downvote ได้ไหม !!! ฟังก์ชั่นต้องการ () และไลบรารี่ () เกือบจะเหมือนกัน (atleast ในกรณีนี้) ดังนั้นแพคเกจก็โหลดไปแล้ว !! ฉันจะไม่รับผิดชอบต่อการขาดข้อมูลของคุณ !!
Mehrad Mahmoudian

8

เมื่อคุณย้อนกลับไปมาระหว่างสคริปต์บางครั้งอาจจำเป็นต้องยกเลิกการโหลดแพคเกจเท่านั้น ต่อไปนี้เป็นคำสั่ง IF ทั่วไปที่จะป้องกันการเตือนที่จะปรากฏขึ้นหากคุณพยายามที่จะยกเลิกการโหลดแพ็คเกจที่ไม่ได้โหลดอยู่ในปัจจุบัน

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

การรวมสิ่งนี้ไว้ที่ด้านบนสุดของสคริปต์อาจมีประโยชน์

ฉันหวังว่าจะทำให้วันของคุณ!


8

detach(package:PackageName) ทำงานได้และไม่จำเป็นต้องใช้เครื่องหมายคำพูด


3

คุณสามารถลองทั้งหมดที่คุณต้องการที่จะลบแพคเกจ (และการอ้างอิงทั้งหมดที่มันนำเข้ามา) โดยใช้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แพ็คเกจและตรวจสอบfootprint หน่วยความจำใหม่:

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 

ตรวจสอบรอยความทรงจำ :

pryr::mem_used()

# 173 MB

เชื่อมโยงไปยังการสาธิตการแสดงหน้าจอ


2

ฉันต้องการเพิ่มทางเลือกอื่น โซลูชันนี้ไม่ได้ตอบคำถามของคุณโดยตรงเกี่ยวกับการยกเลิกการโหลดแพ็คเกจ แต่ IMHO ให้ทางเลือกที่สะอาดกว่าเพื่อให้บรรลุเป้าหมายที่คุณต้องการซึ่งฉันเข้าใจว่าเกี่ยวข้องกับการหลีกเลี่ยงความขัดแย้งของชื่อและลองใช้ฟังก์ชั่นต่าง ๆ ตามที่ระบุไว้:

ส่วนใหญ่เป็นเพราะการรีสตาร์ท R ในขณะที่ฉันลองแตกต่างกันแพคเกจที่ขัดแย้งกันกำลังทำให้หงุดหงิด แต่สิ่งนี้สามารถใช้ในโปรแกรมเพื่อใช้ฟังก์ชันหนึ่งและอีกฟังก์ชันหนึ่ง - แม้ว่าการอ้างอิงเนมสเปซอาจเป็นแนวคิดที่ดีกว่าสำหรับการใช้งานนั้น

สารละลาย

ฟังก์ชั่นที่with_packageนำเสนอผ่านwithrแพคเกจมีความเป็นไปได้ที่:

แนบแพ็กเกจกับพา ธ การค้นหาเรียกใช้งานโค้ดจากนั้นลบแพ็กเกจออกจากพา ธ การค้นหา อย่างไรก็ตามแพ็คเกจเนมสเปซไม่ได้ถูกยกเลิกการโหลด

ตัวอย่าง

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ใช้ในตัวอย่างไม่สามารถเข้าถึงได้จากเนมสเปซส่วนกลาง ฉันคิดว่ามันอาจเป็นวิธีที่ดีกว่าในการจัดการกับความขัดแย้งมากกว่าการโหลดและการขนถ่ายแพ็กเกจ


1

โปรดทราบว่าคุณสามารถใช้ได้unload()ครั้งเดียวเท่านั้น หากคุณใช้เป็นครั้งที่สองโดยไม่ต้องทำการเรียกใช้ซ้ำlibrary()คุณจะได้รับข้อความแสดงข้อผิดพลาดที่ไม่เป็นประโยชน์มากซึ่งเป็นอาร์กิวเมนต์ 'ชื่อ' ที่ไม่ถูกต้อง :

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

สร้างเมื่อ 2020-05-09 โดยแพ็คเกจ reprex (v0.3.0)


0

เพียงไปที่หน้าต่าง OUTPUT จากนั้นคลิกที่ไอคอนแพคเกจ (ซึ่งอยู่ระหว่างไอคอนการลงจุดและไอคอนวิธีใช้ ) ลบ " tick / check mark " ออกจากแพ็คเกจที่คุณต้องการยกเลิกการโหลด

สำหรับการใช้แพคเกจอีกครั้งเพียงแค่ใส่ " ติ๊กหรือเครื่องหมายถูก " ที่หน้าแพ็คเกจหรือใช้:

library (lme4)

1
ไม่ยกเว้นว่าคุณมีเส้นทางห้องสมุดที่กำหนดเอง มันไม่แสดงภายใต้ "แพ็คเกจ" ดังนั้นคุณต้องทำตามวิธีการด้านบน
zazu

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.