【R】defaultPackages 以外の全てのパッケージを detach する

R で getOption(“defaultPackages”) + {base}パッケージ 以外の全てのパッケージを detach するTip。

Rセッション開始時の sessionInfo() は以下。

> sessionInfo()
R version 3.3.1 (2016-06-21)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.12.1 (Sierra)

locale:
[1] ja_JP.UTF-8/ja_JP.UTF-8/ja_JP.UTF-8/C/ja_JP.UTF-8/ja_JP.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] tools_3.3.1

一方、getOption(“defaultPackages”) で取得できるパッケージは以下。getOption() 自体が {base}パッケージ に含まれるためか base は出力されなかった。

> getOption("defaultPackages")
[1] "datasets"  "utils"     "grDevices" "graphics"  "stats"     "methods"  

getOption(“defaultPackages”) + {base}パッケージ 以外の全てのパッケージを detach してみる。

{dplyr} を読み込んだ後の sessionInfo() を確認すると dplyr が attach されていることがわかる。

> sessionInfo()
R version 3.3.1 (2016-06-21)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.12.1 (Sierra)

locale:
[1] ja_JP.UTF-8/ja_JP.UTF-8/ja_JP.UTF-8/C/ja_JP.UTF-8/ja_JP.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] dplyr_0.5.0

loaded via a namespace (and not attached):
[1] magrittr_1.5   R6_2.2.0       assertthat_0.1 DBI_0.5-1      tools_3.3.1    tibble_1.2    
[7] Rcpp_0.12.7   

また, attach されているパッケージ群は search() でも確認できる。 search () はグローバル環境から見たシンボルのサーチパスを出力する。

> search()
 [1] ".GlobalEnv"        "package:dplyr"     "tools:rstudio"    
 [4] "package:stats"     "package:graphics"  "package:grDevices"
 [7] "package:utils"     "package:datasets"  "package:methods"  
[10] "Autoloads"         "package:base"     

読み込んだパッケージが増えてくると逐一 base::detach() で detach していくのは大変なので以下のように関数化しておくと便利。detach all packages while working in R を参考にさせて頂いた。

detach_all <- function() {
  basic.pkg <- c("package:stats", "package:graphics", "package:grDevices", 
    "package:utils", "package:datasets", "package:methods", "package:base")

  pkg.list <- search()[ifelse(unlist(gregexpr("package:", search())) == 1 ,TRUE, FALSE)]

  pkg.list <- setdiff(pkg.list, basic.pkg)

  lapply(pkg.list, detach, character.only = TRUE)
}

search() で得られたベクトルから "package:" を含む要素を抽出し, getOption("defaultPackages") で得られるパッケージに {base} パッケージ を加えた要素との集合の差分に対して lapply で detach() を適用する。

実行後の状態が以下。

> sessionInfo()
R version 3.3.1 (2016-06-21)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.12.1 (Sierra)

locale:
[1] ja_JP.UTF-8/ja_JP.UTF-8/ja_JP.UTF-8/C/ja_JP.UTF-8/ja_JP.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] magrittr_1.5   R6_2.2.0       assertthat_0.1 DBI_0.5-1      tools_3.3.1    tibble_1.2    
[7] Rcpp_0.12.7   

ちなみに, detach できる関数には unloadNamespace() もあり unloadNamespace("dplyr") のように使え dedetach("package:dplyr") よりやや記述が楽となる。