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") よりやや記述が楽となる。