Como descarregar um pacote sem reiniciar o R

540

Gostaria de descarregar um pacote sem ter que reiniciar o R ​​(principalmente porque reiniciar o R ​​ao experimentar diferentes pacotes conflitantes está ficando frustrante, mas é possível que isso possa ser usado em um programa para usar uma função e depois outra - embora o namespace referenciar é provavelmente uma idéia melhor para esse uso).

?library não mostra nenhuma opção que descarregaria um pacote.

Há uma sugestão que detachpode descarregar o pacote, mas os dois seguintes falham:

detach(vegan)

Erro em detach(vegan): nameargumento inválido

detach("vegan")

Erro em detach("vegan"): nameargumento inválido

Então, como descarrego um pacote?

Ari B. Friedman
fonte
4
@Iterator: Uma biblioteca é um local onde você encontra pacotes. (Eles não são sinônimos.) .libPaths()Fornece os caminhos para todas as bibliotecas do seu sistema.
Richie Cotton
16
@ Richie: Obrigado. Eu entendo isso no contexto R, mas acho que o uso de R sobrecarrega ou torna ambíguo o termo libraryde duas maneiras: 1 - não é o mesmo uso libraryque em outros lugares, e 2 - o termo é usado library()para carregar ... não um biblioteca, mas um pacote.
Iterator
2
@Iterator Você está certo. Essa era a resposta que eu precisava e, quando pesquisava no Google, usei "oposto de require" ou "desfazer library" porque é assim que normalmente carrego, erm, "pacotes". A titulação adequada torna a pergunta mais correta, mas também mais difícil de encontrar.
Isomorphismes

Respostas:

656

Tente isto (veja ?detachpara mais detalhes):

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

É possível ter várias versões de um pacote carregadas de uma só vez (por exemplo, se você tiver uma versão de desenvolvimento e uma versão estável em diferentes bibliotecas). Para garantir que todas as cópias sejam desanexadas, use esta função.

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

O uso é, por exemplo

detach_package(vegan)

ou

detach_package("vegan", TRUE)
kohske
fonte
3
@hadley De fato. A versão não citada parece não funcionar na versão mais recente do R. Atualizei a resposta do kohske para refletir sua solução.
Ari B. Friedman
1
@ AriB.Friedman, agora como uma pergunta .
Eric Falha
1
> detach("package:MASS", unload=TRUE) Error in detach("package:MASS", unload = TRUE) : invalid 'name' argument
Mona Jalal
5
Se você receber um erro de argumento 'nome' inválido, adicione character.only = TRUE.
Dan Tenenbaum
2
> desanexar ("pacote: kriging", descarregar = TRUE, character.only = T) Erro ao desanexar ("pacote: kriging", descarregar = TRUE, character.only = T): argumento 'nome' inválido. No entanto, a solução @rstober funciona!
18715 Andrew Andrew
86

Você também pode usar o unloadNamespacecomando, como em:

unloadNamespace("sqldf")

A função desanexa o espaço para nome antes de descarregá-lo.

outubro
fonte
1
No caso de @ solução de kohske também não funcionou para você, isso funcionou para mim
Wassadamo
29

Você pode desmarcar o botão da caixa de seleção no RStudio (pacotes).

Painel de pacotes do RStudio

Ajay Ohri
fonte
16
Vale acrescentar que isso resulta na detach("package:packageToUnload", unload=TRUE)execução de um comando e não é diferente da solução já proposta.
Konrad
2
Além disso, a caixa não está marcada se o pacote foi carregado usando o rstudio install & restart (bug?). Mas você pode apenas marcar e desmarcar.
22719 jiggunjer
9

Tentei o que o kohske escreveu como resposta e obtive um erro novamente. Pesquisei e encontrei o que funcionava para mim (R 3.0.2):

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

ou também

library(splines)
pkg <- "package:splines"
detach(pkg, character.only = TRUE)
Mehrad Mahmoudian
fonte
3
Que erro você recebe? Porque funciona para mim (R 3.1). E a segunda solução é a mesma resposta do @ koshke, apenas sem descarregar (para que o namespace do pacote não seja descarregado).
alko989
Eu recebi o mesmo erro. o ponto é que dei a mesma solução que o @Kohske, mas com um nome de pacote diferente. significa simplesmente que, se você usar o pacote: ele deve funcionar bem, mas se você não o usar, receberá o mesmo erro da pergunta. ;)
Mehrad Mahmoudian
Espere ... então você tentou descarregar um pacote que nem estava carregado? E você está surpreso por ter recebido um erro?
Gregor Thomas
@ Gregor Você poderia ler tudo novamente antes de pressionar o botão voto negativo? !!! a função require () e library () quase faz o mesmo (pelo menos nesse caso), portanto o pacote já está carregado !! Eu não sou responsável por você falta de informação !!
Mehrad Mahmoudian 12/03/2015
8

Quando você alterna entre scripts, às vezes pode ser necessário descarregar um pacote. Aqui está uma instrução IF simples que evitará avisos que apareceriam se você tentasse descarregar um pacote que não estava carregado no momento.

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

Incluir isso na parte superior de um script pode ser útil.

Espero que faça o seu dia!

dca
fonte
8

detach(package:PackageName) funciona e não há necessidade de usar aspas.

Alper Gur
fonte
3

Você pode tentar tudo o que deseja remover um pacote (e todas as dependências que ele trouxe), unloadNamespace()mas o espaço ocupado pela memória ainda persistirá. E não, detach("package:,packageName", unload=TRUE, force = TRUE)também não vai funcionar.

Em um novo console novo ou Session > Restart Rverifique a memória com o pryrpacote:

pryr::mem_used()

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

Verifique meu 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   

Vamos carregar o Seuratpacote e verificar a nova pegada de memória :

library(Seurat)
pryr::mem_used()

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

Vamos usar unloadNamespace()para remover tudo:

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

Agora verifique 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 

Verifique a pegada de memória :

pryr::mem_used()

# 173 MB

Link para demonstração de elenco

Matthew J. Oldach
fonte
2

Eu gostaria de adicionar uma solução alternativa. Esta solução não responde diretamente à sua pergunta sobre o descarregamento de um pacote, mas, o IMHO, fornece uma alternativa mais limpa para atingir o objetivo desejado, que eu entendo, está amplamente preocupado em evitar conflitos de nomes e tentar funções diferentes, conforme declarado:

principalmente porque reiniciar o R ​​enquanto tento diferentes pacotes conflitantes está ficando frustrante, mas é possível que isso possa ser usado em um programa para usar uma função e depois outra - embora a referência ao namespace seja provavelmente uma idéia melhor para esse uso

Solução

A função with_packageoferecida pelo withrpacote oferece a possibilidade de:

anexar um pacote ao caminho de pesquisa, executa o código e remove o pacote do caminho de pesquisa. O espaço para nome do pacote não é descarregado, no entanto.

Exemplo

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

geom_pointusado no exemplo não está acessível no namespace global. Eu acho que pode ser uma maneira mais limpa de lidar com conflitos do que carregar e descarregar pacotes.

Konrad
fonte
1

Observe também que você pode usar apenas unload()uma vez. Se você usá-lo pela segunda vez sem executar library()novamente, você receberá o argumento inválido 'nome' da mensagem de erro não muito informativa :

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

Criado em 2020-05-09 pelo pacote reprex (v0.3.0)

Matifou
fonte
0

Vá para a janela OUTPUT e clique no ícone Packages (está localizado entre os ícones Plot e Help ). Remova a marca de seleção da embalagem que você deseja descarregar.

Para usar novamente o pacote, basta colocar um " visto ou marca de verificação " na frente do pacote ou usar:

library (lme4)
EsKe
fonte
1
A menos que você tenha seu próprio caminho de biblioteca personalizado. Ele não aparece em "pacotes" de modo que você tem que fazer os métodos acima
zazu