How to unload a package without restarting R

Posted by Martina Birk on Monday, May 6, 2024

I'd like to unload a package without having to restart R (mostly because restarting R as I try out different, conflicting packages is getting frustrating, but conceivably this could be used in a program to use one function and then another--although namespace referencing is probably a better idea for that use).

?library doesn't show any options that would unload a package.

There is a suggestion that detach can unload package, but the following both fail:

detach(vegan) 

Error in detach(vegan) : invalid name argument

detach("vegan") 

Error in detach("vegan") : invalid name argument

So how do I unload a package?

3

12 Answers

Try this (see ?detach for more details):

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

It is possible to have multiple versions of a package loaded at once (for example, if you have a development version and a stable version in different libraries). To guarantee that all copies are detached, use this function.

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

Usage is, for example

detach_package(vegan) 

or

detach_package("vegan", TRUE) 
7

You can also use the unloadNamespace command, as in:

unloadNamespace("sqldf") 

The function detaches the namespace prior to unloading it.

1

You can uncheck the checkbox button in RStudio (packages).

RStudio packages pane

2

I tried what kohske wrote as an answer and I got error again, so I did some search and found this which worked for me (R 3.0.2):

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

or also

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

When you are going back and forth between scripts it may only sometimes be necessary to unload a package. Here's a simple IF statement that will prevent warnings that would appear if you tried to unload a package that was not currently loaded.

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

Including this at the top of a script might be helpful.

I hope that makes your day!

detach(package:PackageName) works and there is no need to use quotes.

You can try all you want to remove a package (and all the dependencies it brought in alongside) using unloadNamespace() but the memory footprint will still persist. And no, detach("package:,packageName", unload=TRUE, force = TRUE) will not work either.

From a fresh new console or Session > Restart R check memory with the pryr package:

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

Check my 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 

Let's load the Seurat package and check the new memory footprint:

library(Seurat) pryr::mem_used() # 172 MB ## Likely to change in the future but just to give you an idea 

Let's use unloadNamespace() to remove everything:

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

Now check 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 

Check the memory footprint:

pryr::mem_used() # 173 MB 

Link to screen-cast demonstration

Another option is

devtools::unload("your-package") 

This apparently also deals with the issue of registered S3 methods that are not removed with unloadNamespace()

1

Note also that you can only use unload() once. If you use it a second time without rerunning library(), y'll get the not very informative error message invalid 'name' argument:

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 

Created on 2020-05-09 by the reprex package (v0.3.0)

I would like to add an alternative solution. This solution does not directly answer your question on unloading a package but, IMHO, provides a cleaner alternative to achieve your desired goal, which I understand, is broadly concerned with avoiding name conflicts and trying different functions, as stated:

mostly because restarting R as I try out different, conflicting packages is getting frustrating, but conceivably this could be used in a program to use one function and then another--although namespace referencing is probably a better idea for that use

Solution

Function with_package offered via the withr package offers the possibility to:

attache a package to the search path, executes the code, then removes the package from the search path. The package namespace is not unloaded, however.

Example

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 used in the example is not accessible from the global namespace. I reckon it may be a cleaner way of handling conflicts than loading and unloading packages.

Just go to OUTPUT window, then click on Packages icon (it is located between Plot and Help icons). Remove "tick / check mark" from the package you wanted be unload.

For again using the package just put a "tick or Check mark" in front of package or use :

library (lme4) 
1

Connected with @tjebo answer.

TL;DR
Please use pkgload:::unload instead of devtools::unload as they are the same function (1 to 1) and pkgload is a much lighter package (nr of dependencies). devtools simply reexporting the pkgload:::unload function.

Unfortunately devtools is a huge dependency (as devtools has a lot of own dependencies), which is more development stage targeted. So if you want to use the unload function in your own package or you care about library size please remember to use pkgload:::unload instead of devtools::unload. devtools simply reexporting the pkgload:::unload function.

Please check the footer of the devtools::unload function to quickly confirm the reexport or go to the github repo

> devtools::unload function (package = pkg_name(), quiet = FALSE) { if (package == "compiler") { oldEnable <- compiler::enableJIT(0) if (oldEnable != 0) { warning("JIT automatically disabled when unloading the compiler.") } } if (!package %in% loadedNamespaces()) { stop("Package ", package, " not found in loaded packages or namespaces") } unregister_methods(package) unloaded <- tryCatch({ unloadNamespace(package) TRUE }, error = function(e) FALSE) if (!unloaded) { unload_pkg_env(package) unregister_namespace(package) } clear_cache() unload_dll(package) } <bytecode: 0x11a763280> <environment: namespace:pkgload> 

ncG1vNJzZmirpJawrLvVnqmfpJ%2Bse6S7zGiorp2jqbawutJobXJvaW5%2BeHvHqK5mrJ9iwq%2B4zpqbZpldpa6kt8CgnGavmam1sMHTZqmeq6SWv7W1zaBkqw%3D%3D