Як вивантажити пакет без перезавантаження R


540

Я хотів би вивантажити пакет без необхідності перезавантаження R (здебільшого через те, що перезапуск R, коли я випробовую різні, конфліктні пакети стає розчаровуючим, але, можливо, це може бути використане в програмі для використання однієї функції, а потім іншої, хоча простір імен посилання - це, мабуть, краща ідея для цього використання).

?library не показує жодних опцій, які б розвантажували пакет.

Є пропозиція, яка detachможе вивантажити пакунок, але наступні обоє не вдаються:

detach(vegan)

Помилка detach(vegan): недійсний nameаргумент

detach("vegan")

Помилка detach("vegan"): недійсний nameаргумент

Тож як я вивантажую пакет?


4
@Iterator: Бібліотека - це місце, де ви знайдете пакети. (Вони не є синонімами.) .libPaths()Дає вам шлях до всіх бібліотек вашої системи.
Річі Коттон

16
@Richie: Дякую Я розумію, що це в контексті R, але я вважаю, що використання R перевантажує або робить неоднозначний термін libraryдвома способами: 1 - це не те саме використання, libraryяк в іншому місці, і 2 - термін використовується library()для завантаження ... не бібліотека, але пакет.
Ітератор

2
@Iterator Ви праві. Ця відповідь мені була потрібна, і під час googling я використовував "навпроти require" або "скасувати library", тому що я зазвичай завантажую, erm, "пакети". Таким чином, під назвою його правильно зробити питання більш правильним, але й важче знайти.
ізоморфізми

Відповіді:


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 Дійсно. Версія без котирування, здається, не працює в останній версії Р. Я оновив відповідь kohske, щоб відобразити ваше рішення.
Арі Б. Фрідман

1
@ AriB.Friedman, тепер як питання .
Eric Fail

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

5
Якщо ви отримаєте недійсну помилку аргументу "ім'я", додайте знак символу.only = TRUE.
Дан Тененбаум

2
> detach ("пакет: kriging", unload = TRUE, character.only = T) Помилка detach ("пакет: kriging", unload = TRUE, character.only = T): недійсний аргумент "name". Однак рішення @rstober дійсно працює!
Андрій

86

Ви також можете використовувати unloadNamespaceкоманду, як у:

unloadNamespace("sqldf")

Функція відключає простір імен перед завантаженням.


1
У випадку, якщо рішення @ kohske також не працювало для вас, це працювало для мене
Wassadamo

29

Ви можете зняти прапорець у RStudio (пакети).

Панель пакетів RStudio


16
Варто додати, що це призводить до виконання detach("package:packageToUnload", unload=TRUE)команди і не відрізняється від вже запропонованого рішення.
Конрад

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, але з різною назвою пакета. це просто означає, що якщо ви використовуєте пакет: тоді він повинен працювати нормально, але якщо ви цього не використовуєте, ви отримаєте ту ж помилку, що і в питанні. ;)
Мехрад Махмудіян

Зачекайте ... значить, ви намагалися вивантажити пакет, який навіть не був завантажений? І ви здивовані, що ви отримали помилку?
Грегор Томас

@Gregor Чи бажаєте ви прочитати ще раз все, перш ніж натиснути кнопку downvote? !!! функція вимагає (), а бібліотека () майже робить те саме (щонайменше в цьому випадку), тому пакет уже завантажений !! Я не несу відповідальності за вас відсутність інформації !!
Мехрад Махмудян

8

Коли ви повертаєтесь назад і назад між сценаріями, можливо, іноді буде потрібно розвантажувати пакет. Ось простий випадок IF, який запобігає появі попереджень, які б ви намагалися вивантажити пакет, який наразі не завантажений.

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

Включення цього вгорі сценарію може бути корисним.

Я сподіваюся, що це робить ваш день!



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пакет і перевіримо новий слід пам'яті :

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()повторюючи, ви отримаєте не дуже інформативне повідомлення про помилку, невірний аргумент 'name' :

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, потім натисніть на піктограму Packages (вона розташована між піктограмами « Сюжет» та «Довідка» ) Видаліть " галочку / галочку " з пакету, який хочете вивантажити.

Для повторного використання пакету просто поставте " Поставте галочку " перед пакетом або використовуйте:

library (lme4)

1
Якщо у вас є власний шлях до бібліотеки. Він не відображається в розділі "Пакети", тому вам доведеться виконати описані вище методи
zazu

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.