パッケージレベルでのスコープ

昨日 「carsとかのデータセット名前空間を汚してる」みたいなことを書いてしまったが完全に間違い。実際には当たり前だけどもっと考えてあった。結論から言うと carsなどは package:datasetsの下の名前空間のみを汚染していて、グローバルを汚染しているように見えていたのはR独特のパッケージ間の名前解決の仕組み(サーチパス)のためだった。
各パッケージは独自の名前空間(環境)をもっていて、グローバルとは独立している。名前解決の際は上記のサーチパスを上から順に辿って目的のエントリを探す。サーチパスの一番上がグローバル空間で、各パッケージの空間が次に続く。うちの環境だとこんな感じ。

> searchpath()
[1] ".GlobalEnv"
[2] "/Library/Frameworks/R.framework/Resources/library/stats"
[3] "/Library/Frameworks/R.framework/Resources/library/graphics"
[4] "/Library/Frameworks/R.framework/Resources/library/grDevices"
[5] "/Library/Frameworks/R.framework/Resources/library/utils"
[6] "/Library/Frameworks/R.framework/Resources/library/datasets"
[7] "/Library/Frameworks/R.framework/Resources/library/methods"
[8] "Autoloads"
[9] "/Library/Frameworks/R.framework/Resources/library/base"

# 順序の定義はまだよくわかってないんだけど後に読まれたやつが上に来るみたい。コントロールする方法もあるのかな?
名前空間を直接指定してもアクセスできる。::
carsとかUSArrestsとかは datasetsにあるようで、 detach(package:dataset)とかすると消え去る。
rubyのincludeみたいな感じと思っとけばいいんだろうか。