(Rの)環境問題が界隈を賑やかしているっぽい。例えば、
http://obeautifulcode.com/R/How-R-Searches-And-Finds-Stuff/
に素晴らしい記事が出た。この記事を理解すればRの環境の8割はマスターしたと言えそうだ。
この記事の内容についてざっと触れた後に、関数呼び出しに伴う環境(+promise)、パッケージ云々での落穂ひろい的な情報を書いてみようと思う。
まず理解するように、ということで細かい所で不正確なところはたくさんあります。
#1. 環境についてのざっくりとした説明
##1-1. 名前
> mean(1:3)
[1] 6
mean
が名前。関数名。
> pi
[1] 3.141593
pi
が名前。変数名。
###変数とか関数の名前一覧を見るには。
> ls()
[1] "e" "l" "o" "P" "x"
と、ls()
を使う。あれ、mean
もpi
もない。じゃあどこにある?
##1-2. 環境(っていうか、たらい回し)
こういう説明がいいのかどうかよくわかんなけいど・・・
誰かになんか欲しいって言われても持ってなかった時、せめて、じゃああの人に持ってるか聞いたらいいよ、って答えるのが親切で、Rの環境はこれと同じようなもの。
Rの中で私が何か(例えばmean
とかpi
)とかを探すとき、まず身近な相手にそれを持ってるか聞く。その人がmean
とかpi
とか持ってなかった時、じゃあ次はこの人に聞いてね、っていうのを教えてくれる。それをずーっとたどっていって最後まで誰も持ってなかったらエラー。
最初に聞く相手は.GlobalEnv
というやつ。
> .GlobalEnv
<environment: R_GlobalEnv>
↑こいつね。
で、こいつが持ってるものを聞くには、やっぱりls()
を使う。
> ls(pos = .GlobalEnv)
[1] "P" "d" "e" "i" "l" "o" "p" "x"
こいつがもってなかった時、次の人を紹介してくれる。次の人を知るにはparent.env()
。
> parent.env(.GlobalEnv)
<environment: package:stats>
attr(,"name")
[1] "package:stats"
attr(,"path")
[1] "/Library/Frameworks/R.framework/Versions/2.15/Resources/library/stats"
ごちゃごちゃ書いてあるけど、要するに、package:stats
っていうのが次の人。あなたの場合は違うかもしれないけど。
で、package:stats
さんmean
をもってるかというと・・・
> ls(pos = "package:stats")
[1] "acf" "acf2AR" "add.scope" "add1"
[5] "addmargins" "aggregate" "aggregate.data.frame" "aggregate.default"
...以下略
ないわ。なので、また次の人を紹介してもらいます。この紹介の順番はsearch()
で簡単に知ることができて、
> search()
[1] ".GlobalEnv" "package:stats" "package:graphics" "package:grDevices" "package:utils"
[6] "package:datasets" "package:devtools" "MacJapanEnv" "package:methods" "Autoloads"
[11] "package:base"
という感じで、最後がpackage:base
です。Rはこの、順番に聞いてたらい回しで、っていう作業を勝手にやってくれている、ということです。
最後まで探してなければない、ということでエラーです。
> orz
Error: object 'orz' not found
orz
という名前はどこにも見つかりませんでした。
ちなみにmean
はpackage:base
にあります。誰が知ってるかを知りたければ、
> find("mean")
[1] "package:base"
ですね。