trinker / pacman

A package management tools for R
309 stars 37 forks source link

p_unload for namespaces not in searchpath #100

Open yonicd opened 6 years ago

yonicd commented 6 years ago

is there a good way to unload namespaces in the correct order for a namespace that i attached using asNamespace?

using p_unload i get this:

Restarting R session...

loadedNamespaces()
# [1] "graphics"  "tools"     "utils"     "yaml"      "grDevices" "stats"     "datasets"  "methods"   "base"     
asNamespace('ggplot2')
# <environment: namespace:ggplot2>
loadedNamespaces()
# [1] "colorspace" "scales"     "lazyeval"   "plyr"       "graphics"   "tools"      "pillar"     "gtable"     "utils"      "tibble"     "yaml"       "grDevices"  "Rcpp"       "stats"     
# [15] "ggplot2"    "datasets"   "grid"       "methods"    "rlang"      "munsell"    "base"      
pacman::p_unload('ggplot2')
# The following packages were not previously loaded:ggplot2

loadedNamespaces()
# [1] "colorspace" "scales"     "lazyeval"   "plyr"       "graphics"   "tools"      "pillar"     "gtable"     "utils"      "tibble"     "yaml"       "grDevices"  "Rcpp"       "stats"     
# [15] "ggplot2"    "datasets"   "grid"       "methods"    "pacman"     "rlang"      "munsell"    "base"  
yonicd commented 6 years ago

this came up when i want to list exported functions in all installed packages, but I end up chocking the loadedNamespace if .libPaths() have too many packages in them

Dasonk commented 6 years ago

Interesting. p_unload is/was mainly for unloading and removing from the search path. As far as I can tell we never thought or cared about namespaces that were loaded but not attached since they don't actually mess up anything to do with the search path.

We could look into adding a parameter to p_unload to unload packages that are loaded but not attached.

yonicd commented 6 years ago

btw this is my motivation use case: https://github.com/metrumresearchgroup/sinew/blob/master/R/pretty_namespace.R

txt <- '#some comment
 yy <- function(a=4){
   head(runif(10),a)
   # a comment
 }

 zz <- function(v=10,a=8){
   head(runif(v),a)
 }'
pretty_namespace(text=txt)
#some comment
yy <- function(a=4){
  utils::head(stats::runif(10),a)
  # a comment
}

zz <- function(v=10,a=8){
  utils::head(stats::runif(v),a)
}
yonicd commented 6 years ago

if you want you can use the fn i wrote in the end (fork of the nothing pkg), which is brute force.

https://github.com/metrumresearchgroup/sinew/blob/master/R/something.R

yonicd commented 6 years ago

this is also an issue that pops up in the clean up (the dll's dont unload,this is a pacman issue too)

https://github.com/romainfrancois/nothing/issues/9

library(ggplot2)
basename(unlist(sapply(library.dynam(),'[',2)))
# [1] "methods.so"    "utils.so"      "grDevices.so"  "graphics.so"   "stats.so"      "tools.so"     
# [7] "yaml.so"       "digest.so"     "grid.so"       "Rcpp.so"       "colorspace.so" "plyr.so"      
# [13] "scales.so"     "lazyeval.so"   "rlang.so"      "tibble.so"    
pacman::p_unload('ggplot2')
# The following packages have been unloaded:ggplot2

basename(unlist(sapply(library.dynam(),'[',2)))
# [1] "methods.so"    "utils.so"      "grDevices.so"  "graphics.so"   "stats.so"      "tools.so"     
# [7] "yaml.so"       "digest.so"     "grid.so"       "Rcpp.so"       "colorspace.so" "plyr.so"      
# [13] "scales.so"     "lazyeval.so"   "rlang.so"      "tibble.so"
yonicd commented 6 years ago

solved my problem:

txt <- "#some comment
#' @import utils
yy <- function(a=4){
 utils::head(runif(10),a)

  aes()

 # a comment
}"

> library(sinew)
Setting sinew_opts to _sinewconfig.yml specs
Current add_fields: details,examples,seealso,rdname,export,author
> library.dynam()
                                                                                     Filename Dynamic.Lookup
1      /Library/Frameworks/R.framework/Versions/3.3/Resources/library/methods/libs/methods.so          FALSE
2          /Library/Frameworks/R.framework/Versions/3.3/Resources/library/utils/libs/utils.so          FALSE
3  /Library/Frameworks/R.framework/Versions/3.3/Resources/library/grDevices/libs/grDevices.so          FALSE
4    /Library/Frameworks/R.framework/Versions/3.3/Resources/library/graphics/libs/graphics.so          FALSE
5          /Library/Frameworks/R.framework/Versions/3.3/Resources/library/stats/libs/stats.so          FALSE
6          /Library/Frameworks/R.framework/Versions/3.3/Resources/library/tools/libs/tools.so          FALSE
7            /Library/Frameworks/R.framework/Versions/3.3/Resources/library/yaml/libs/yaml.so           TRUE
8        /Library/Frameworks/R.framework/Versions/3.3/Resources/library/digest/libs/digest.so           TRUE
9            /Library/Frameworks/R.framework/Versions/3.3/Resources/library/Rcpp/libs/Rcpp.so           TRUE
10 /Library/Frameworks/R.framework/Versions/3.3/Resources/library/htmltools/libs/htmltools.so          FALSE
11       /Library/Frameworks/R.framework/Versions/3.3/Resources/library/httpuv/libs/httpuv.so           TRUE
12           /Library/Frameworks/R.framework/Versions/3.3/Resources/library/mime/libs/mime.so           TRUE
13     /Library/Frameworks/R.framework/Versions/3.3/Resources/library/stringi/libs/stringi.so          FALSE
> loadedNamespaces()
 [1] "shiny"      "R6"         "graphics"   "htmltools"  "tools"      "rstudioapi" "utils"      "sinew"     
 [9] "yaml"       "grDevices"  "memoise"    "Rcpp"       "stats"      "datasets"   "stringi"    "methods"   
[17] "digest"     "xtable"     "httpuv"     "mime"       "miniUI"     "base"      
> pretty_namespace(text=txt,check.installed = TRUE)
still missing functions: aes, updating memoised index of other installed libraries (421)... the initial index may be a while

found all!
#some comment
#' @import utils
yy <- function(a=4){
 utils::head(stats::runif(10),a)

  ggplot2::aes()

 # a comment
}
> library.dynam()
                                                                                     Filename Dynamic.Lookup
1      /Library/Frameworks/R.framework/Versions/3.3/Resources/library/methods/libs/methods.so          FALSE
2          /Library/Frameworks/R.framework/Versions/3.3/Resources/library/utils/libs/utils.so          FALSE
3  /Library/Frameworks/R.framework/Versions/3.3/Resources/library/grDevices/libs/grDevices.so          FALSE
4    /Library/Frameworks/R.framework/Versions/3.3/Resources/library/graphics/libs/graphics.so          FALSE
5          /Library/Frameworks/R.framework/Versions/3.3/Resources/library/stats/libs/stats.so          FALSE
6          /Library/Frameworks/R.framework/Versions/3.3/Resources/library/tools/libs/tools.so          FALSE
7            /Library/Frameworks/R.framework/Versions/3.3/Resources/library/yaml/libs/yaml.so           TRUE
8        /Library/Frameworks/R.framework/Versions/3.3/Resources/library/digest/libs/digest.so           TRUE
9            /Library/Frameworks/R.framework/Versions/3.3/Resources/library/Rcpp/libs/Rcpp.so           TRUE
10 /Library/Frameworks/R.framework/Versions/3.3/Resources/library/htmltools/libs/htmltools.so          FALSE
11       /Library/Frameworks/R.framework/Versions/3.3/Resources/library/httpuv/libs/httpuv.so           TRUE
12           /Library/Frameworks/R.framework/Versions/3.3/Resources/library/mime/libs/mime.so           TRUE
13     /Library/Frameworks/R.framework/Versions/3.3/Resources/library/stringi/libs/stringi.so          FALSE
> loadedNamespaces()
 [1] "Rcpp"       "methods"    "utils"      "tools"      "grDevices"  "digest"     "memoise"    "sinew"     
 [9] "shiny"      "rstudioapi" "yaml"       "graphics"   "datasets"   "stats"      "base"       "R6"        
[17] "htmltools"  "mime"       "xtable"     "httpuv"     "stringi"    "miniUI"     "lazyeval"