« ちょっとした覚書:Stanのデータ型について | メイン | ちょっとした覚え書き:グラフの推移性とクラスタ係数はどうちがうか »
2019年11月 8日 (金)
最近なんだかこんなことばっかりなんだけど...
Rで環境 (environment) と呼ばれるオブジェクトを操作したいとき、関数名がよく分からなくて困ることが多い。rlangパッケージというのを使うと、もっと使いやすい関数がわかりやすい名前で提供されていてありがたいんだけど、従来の関数との対応がわからなくて、それはそれで混乱する。
このたびついに業を煮やして、神Hadleyが与えたもうたAdvanced R 2nd edition, Chapter 7. Environments を参照しつつメモを取った。
すいません、私の私による私のためのメモです。
環境そのものの操作
- 環境をつくる: rlang::env(); new.env()
- 環境 e を表示する: rlang::env_print(e), print(e). ただしprint()では中身はわからない
- 環境 e の親環境: rlang::env_parent(e), parent.env(e)
- 環境 e のすべての先祖の環境: rlang::env_parents(e)
- 空の環境(すべての環境の始祖): rlang::enpty_env()
- グローバル環境(いわゆるワークスペース): rlang::globalenv(), .GlobalEnv
- サーチパス(グローバル環境の先祖の環境たち)の名前を返す: search()
- サーチパスの環境たちを返す: rlang::search_envs()
- baseパッケージのパッケージ環境 (そのパッケージが外部に提供する環境): rlang::base_env()
- 現在の実行環境(関数の実行中はその関数の実行環境、そうでない場合はグローバル環境): rlang::current_env(), environment()
- 現在の関数を呼び出している関数の実行環境: rlang::caller_env(), parent.frame()
- ある関数が実行されるときに生まれる実行環境の親は、その関数の「関数環境」である(呼び出し元の関数の実行環境ではない。ここ、ときどき勘違いしちゃいますね)。関数環境とは、その関数がつくられたときにそいつがbindしたというかキャプチャした環境のこと。対話的につくった関数の関数環境はグローバル環境、関数1のなかでつくった関数2の関数環境は関数1の実行環境となる。
- 関数 fの関数環境: rlang::fn_env(f), environment(f)
- パッケージのなかの関数の関数環境はそのパッケージの名前空間環境。その親はそのパッケージのimports環境。その親はbaseパッケージの名前空間環境。その親はグローバル環境。
環境の中身の操作
- 環境 e のなかの名前をみる: rlang::env_names(e), names(e), ls(e, all.names = T)
- 環境 e が要素 x を持っているかを調べる: rlang::env_has(e, "x"), exists("x", e)
- 環境 e の要素 x にアクセスする: e$x, e[["x"]]
- 環境 e の要素 x の値を得る(存在しないときにはエラーを発生させる): rlang::env_get(e, "x"), get("x", e, inherits = FALSE)
- 環境 e の要素 x に値 1 をbindする: rlang::env_poke(e, "x", 1), rlang::env_bind(e, x = 1); assign("x", 1, e).
- 環境 e の要素 x に表現myfun()をbindするが、そのときは評価せず、最初にアクセスしたときだけ評価する: rlang::env_bind_lazy(e, x = myfun()), delayedAssign("x", myfun(), assign.env = e)
- 環境 e の要素 x に関数myfunをbindする。アクセスするたびに評価する: rlang::env_bind_active(e, x = myfun), makeActiveBinding("x", myfun, e)
- 環境 e の要素 x を消す: rlang::env_unbind(e, "x"), rm("x", envir = e)。なお、e$x <- NULL では消せない。
- 永続付値 <<- は、先祖の環境たちのどこかにある変数を変更する。どこにもみつからなかったらグローバル環境に変数をつくる。現在の環境にある変数を変更したり、変数をつくったりすることはない
雑記:データ解析 - ちょっとした覚書:Rの環境を操作する関数