Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Rの環境とスコープItoshi NIKAIDO <dritoshi@gmail.com>
Rはすべてがオブジェクトvector, matrix, 関数...ひとつのクラスに属する
オブジェクトを上書きされたくない関数を呼び出すパッケージを読み込む
どのようなオブジェクトが利用可能か?
Lexical scoping複数の環境からオブジェクトを探す・環境を作成する規則
environment環境
environment= frame + enclosure
environment= frame + enclosure symbol    value  x  1
environment= frame + enclosure 環境へのpointer どの環境と結びついているのか?
環境の構造線形のツリー   emptyenv()          baseenv()                 ...                       ...                             glob...
Search Pathオブジェクトを検索する順序   emptyenv() R_EmptyEnv                                     search path: オブジェクト          baseenv(...
Package やデータがロードされると...library() と attach()      emptyenv() R_EmpltyEnv               baseenv() base                      ...
関数を定義すると...クロージャ環境が作られ、呼び出されるたびに評価環境が生成される   emptyenv() R_EmpltyEnv         関数を定義する                                  その環境を...
関数の引数はいつ評価されるのかcall-by-value と lazy evaluation      emptyenv() R_EmpltyEnv                 関数を定義する                        ...
サーチパスを制御したいサーチパスの例外的な処理である名前空間を利用する     emptyenv() R_EmpltyEnv    - 同名のオブジェクトを区別する                               - オブジェクトの...
Rで環境を操作する環境の情報を得る   emptyenv() R_EmpltyEnv               検索する                   parent.env()         environment(ls)      ...
Rで環境を操作する環境に対する変数の操作   emptyenv() R_EmpltyEnv            baseenv() base   # 変数を割り当てる   > assign("a", 1:10, envir = baseenv...
Rで名前空間を操作する名前空間の情報を得る・パッケージ内の変数にアクセスする# 名前空間の情報             # 変数にアクセスするloadedNamespaces()    # Package::name              ...
Rでは環境はどのように表現されているか実は単なる listR> e <- new.env()R> e<environment: 0x103186150>R> e$a <- 1R> e$b <- "hoge"R> e$b# 環境を list にす...
環境は参照渡しRは基本的に値渡しであるが環境は例外R> e <- new.env()R> e2 <- eR> e<environment: 0x103186150>R> e2<environment: 0x103186150># 同じポインタを...
まとめオブジェクトを上書きしたくなかった• Rは Lexical scope rule で使えるオブジェクトを知ることができる• Rは環境によって Lexical scope を達成していた• ユーザが環境を作ることでスコープルールに基いたオブ...
参考資料論文、オンラインドキュメント、書籍  • Lexical Scope and Statistical Computing  • The R Language Definition  • Rプログラミングマニュアル  • Rの基礎とプログラ...
Upcoming SlideShare
Loading in …5
×

Rの環境とスコープ

5,488 views

Published on

  • Be the first to comment

Rの環境とスコープ

  1. 1. Rの環境とスコープItoshi NIKAIDO <dritoshi@gmail.com>
  2. 2. Rはすべてがオブジェクトvector, matrix, 関数...ひとつのクラスに属する
  3. 3. オブジェクトを上書きされたくない関数を呼び出すパッケージを読み込む
  4. 4. どのようなオブジェクトが利用可能か?
  5. 5. Lexical scoping複数の環境からオブジェクトを探す・環境を作成する規則
  6. 6. environment環境
  7. 7. environment= frame + enclosure
  8. 8. environment= frame + enclosure symbol value x 1
  9. 9. environment= frame + enclosure 環境へのpointer どの環境と結びついているのか?
  10. 10. 環境の構造線形のツリー emptyenv() baseenv() ... ... globalenv() .GlobalEnv いわゆるワークスペース コンソールやスクリプトからの入力さ れたオブジェクトが格納される ※ 関数やパッケージは別
  11. 11. Search Pathオブジェクトを検索する順序 emptyenv() R_EmptyEnv search path: オブジェクト baseenv() base を検索する環境の順序 ... search() ... globalenv() R_GlobalEnv
  12. 12. Package やデータがロードされると...library() と attach() emptyenv() R_EmpltyEnv baseenv() base ロードされたオブジェクトはbase ... と.GlobalEnvの間に置かれる library() ... attach() globalenv() R_GlobalEnv
  13. 13. 関数を定義すると...クロージャ環境が作られ、呼び出されるたびに評価環境が生成される emptyenv() R_EmpltyEnv 関数を定義する その環境を含む環境が作られる baseenv() base = closure 環境 ... 関数を呼び出す クロージャー環境を元に環境 ... (評価環境)が作られて、 1番目に置かれる globalenv() R_GlobalEnv 関数が環境とセットになっているので、関数は自分の場所を知っている。 R はこれを利用してオブジェクトを探す。 このようなスコープ規則のことを Lexical scope と呼ぶ このような関数のことをクロージャ関数と呼ぶ
  14. 14. 関数の引数はいつ評価されるのかcall-by-value と lazy evaluation emptyenv() R_EmpltyEnv 関数を定義する その環境を含む環境が作られる baseenv() base = closure 環境 ... 関数を呼び出す クロージャー環境を元に環境 ... (評価環境)が作られて、 1番目に置かれる globalenv() R_GlobalEnv 1. 関数が呼び出されると、評価環境の引数マッチング規則で 仮引数と実引数が照合される 2. 関数が評価される 3. 引数が必要になったら、引数で与えられた値に初期化される (遅延評価) このとき値のポインタではなく、値そのものに置き変わる (値渡し) (遅延評価は予約オブジェクトで達成しているが説明を割愛)
  15. 15. サーチパスを制御したいサーチパスの例外的な処理である名前空間を利用する emptyenv() R_EmpltyEnv - 同名のオブジェクトを区別する - オブジェクトのカプセル化 をするための例外 = namespace baseenv() base 0. オブジェクトを提供するパッケージ ... の名前空間 1. インポートされオブジェクト3. search path 2. base パッケージの名前空間 globalenv() R_GlobalEnv
  16. 16. Rで環境を操作する環境の情報を得る emptyenv() R_EmpltyEnv 検索する parent.env() environment(ls) baseenv() base 存在の確認 exists(“+”, env = baseenv()) ...search() 環境を作る e1searchpaths() e1 <- new.env()topenv() globalenv() R_GlobalEnv
  17. 17. Rで環境を操作する環境に対する変数の操作 emptyenv() R_EmpltyEnv baseenv() base # 変数を割り当てる > assign("a", 1:10, envir = baseenv()) # 検索する > exists("a", envir = globalenv(), inherits = FALSE) [1] FALSE > exists("a", envir = baseenv(), inherits = FALSE) [1] TRUE # 変数を検索して、値を取り出す > mget("a", envir = baseenv()) $a [1] 1 2 3 4 5 6 7 8 9 10 > get("a", envir = baseenv()) [1] 1 2 3 4 5 6 7 8 9 10
  18. 18. Rで名前空間を操作する名前空間の情報を得る・パッケージ内の変数にアクセスする# 名前空間の情報 # 変数にアクセスするloadedNamespaces() # Package::name # export() されている関数# 名前空間の操作 base::logloadNamespace(ns)unloadNamespace(ns) # Package:::nameattachNamespace(ns) # export() されていない関数 library(“Package”)# 名前空間の作成 Package:::nameasNamespace(“name”)# エクスポート # 関数を適用namespaceExport(ns) eapply(env, FUN)
  19. 19. Rでは環境はどのように表現されているか実は単なる listR> e <- new.env()R> e<environment: 0x103186150>R> e$a <- 1R> e$b <- "hoge"R> e$b# 環境を list にするR> as.list(e)$a[1] 1$b[1] "hoge"
  20. 20. 環境は参照渡しRは基本的に値渡しであるが環境は例外R> e <- new.env()R> e2 <- eR> e<environment: 0x103186150>R> e2<environment: 0x103186150># 同じポインタをさしているR> e$aNULL# e2 に a をつくるR> e2$a <- 1R> e2$a1# 参照渡しなのでe にも a ができているR> e$a[1] 1
  21. 21. まとめオブジェクトを上書きしたくなかった• Rは Lexical scope rule で使えるオブジェクトを知ることができる• Rは環境によって Lexical scope を達成していた• ユーザが環境を作ることでスコープルールに基いたオブジェクトを生 成・管理できる• Namespaceでスコープルールの例外を作り、ユーザがそのスコープ範囲 を決めることができる。Rでは後付けの実装なので今でも仕様が若干変 化中
  22. 22. 参考資料論文、オンラインドキュメント、書籍 • Lexical Scope and Statistical Computing • The R Language Definition • Rプログラミングマニュアル • Rの基礎とプログラミング技法

×