SlideShare uma empresa Scribd logo
1 de 22
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()

                 ...


                       ...


                             globalenv() .GlobalEnv

                             いわゆるワークスペース
                             コンソールやスクリプトからの入力さ
                             れたオブジェクトが格納される
                             ※ 関数やパッケージは別
Search Path
オブジェクトを検索する順序



   emptyenv() R_EmptyEnv

                                     search path: オブジェクト
          baseenv() base
                                     を検索する環境の順序
                 ...                 search()


                       ...


                             globalenv() R_GlobalEnv
Package やデータがロードされると...
library() と attach()



      emptyenv() R_EmpltyEnv


               baseenv() base
                                      ロードされたオブジェクトはbase
                       ...            と.GlobalEnvの間に置かれる
                                      library()
                             ...      attach()


                                   globalenv() R_GlobalEnv
関数を定義すると...
クロージャ環境が作られ、呼び出されるたびに評価環境が生成される



   emptyenv() R_EmpltyEnv         関数を定義する
                                  その環境を含む環境が作られる
          baseenv() base          = closure 環境

                 ...              関数を呼び出す
                                  クロージャー環境を元に環境
                       ...        (評価環境)が作られて、
                                  1番目に置かれる
                             globalenv() R_GlobalEnv

 関数が環境とセットになっているので、関数は自分の場所を知っている。
 R はこれを利用してオブジェクトを探す。
 このようなスコープ規則のことを Lexical scope と呼ぶ
 このような関数のことをクロージャ関数と呼ぶ
関数の引数はいつ評価されるのか
call-by-value と lazy evaluation



      emptyenv() R_EmpltyEnv                 関数を定義する
                                             その環境を含む環境が作られる
               baseenv() base                = closure 環境

                        ...                  関数を呼び出す
                                             クロージャー環境を元に環境
                                  ...        (評価環境)が作られて、
                                             1番目に置かれる
                                        globalenv() R_GlobalEnv
            1. 関数が呼び出されると、評価環境の引数マッチング規則で
            仮引数と実引数が照合される
            2. 関数が評価される
            3. 引数が必要になったら、引数で与えられた値に初期化される (遅延評価)
            このとき値のポインタではなく、値そのものに置き変わる (値渡し)
            (遅延評価は予約オブジェクトで達成しているが説明を割愛)
サーチパスを制御したい
サーチパスの例外的な処理である名前空間を利用する


     emptyenv() R_EmpltyEnv    - 同名のオブジェクトを区別する
                               - オブジェクトのカプセル化
                               をするための例外 = namespace
            baseenv() base

                               0. オブジェクトを提供するパッケージ
                   ...
                               の名前空間
                               1. インポートされオブジェクト
3. search path                 2. base パッケージの名前空間

                              globalenv() R_GlobalEnv
Rで環境を操作する
環境の情報を得る


   emptyenv() R_EmpltyEnv               検索する

                   parent.env()         environment(ls)
          baseenv() base           存在の確認
                                   exists(“+”, env = baseenv())
                 ...

search()                          環境を作る
                       e1
searchpaths()                     e1 <- new.env()
topenv()
                            globalenv() R_GlobalEnv
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
Rで名前空間を操作する
名前空間の情報を得る・パッケージ内の変数にアクセスする




# 名前空間の情報             # 変数にアクセスする
loadedNamespaces()    # Package::name
                      # export() されている関数
# 名前空間の操作             base::log
loadNamespace(ns)
unloadNamespace(ns)   # Package:::name
attachNamespace(ns)   # export() されていない関数
                      library(“Package”)
# 名前空間の作成             Package:::name
asNamespace(“name”)
# エクスポート              # 関数を適用
namespaceExport(ns)   eapply(env, FUN)
Rでは環境はどのように表現されているか
実は単なる list



R> e <- new.env()
R> e
<environment: 0x103186150>
R> e$a <- 1
R> e$b <- "hoge"
R> e$b

# 環境を list にする
R> as.list(e)
$a
[1] 1

$b
[1] "hoge"
環境は参照渡し
Rは基本的に値渡しであるが環境は例外

R> e <- new.env()
R> e2 <- e
R> e
<environment: 0x103186150>
R> e2
<environment: 0x103186150>
# 同じポインタをさしている


R> e$a
NULL
# e2 に a をつくる
R> e2$a <- 1
R> e2$a
1
# 参照渡しなのでe にも a ができている
R> e$a
[1] 1
まとめ
オブジェクトを上書きしたくなかった




• Rは Lexical scope rule で使えるオブジェクトを知ることができる
• Rは環境によって Lexical scope を達成していた
• ユーザが環境を作ることでスコープルールに基いたオブジェクトを生
  成・管理できる

• Namespaceでスコープルールの例外を作り、ユーザがそのスコープ範囲
  を決めることができる。Rでは後付けの実装なので今でも仕様が若干変

  化中
参考資料
論文、オンラインドキュメント、書籍




  • Lexical Scope and Statistical Computing
  • The R Language Definition

  • Rプログラミングマニュアル
  • Rの基礎とプログラミング技法

Mais conteúdo relacionado

Mais procurados

パターン認識と機械学習 §6.2 カーネル関数の構成
パターン認識と機械学習 §6.2 カーネル関数の構成パターン認識と機械学習 §6.2 カーネル関数の構成
パターン認識と機械学習 §6.2 カーネル関数の構成Prunus 1350
 
PRML 3.3.3-3.4 ベイズ線形回帰とモデル選択 / Baysian Linear Regression and Model Comparison)
PRML 3.3.3-3.4 ベイズ線形回帰とモデル選択 / Baysian Linear Regression and Model Comparison)PRML 3.3.3-3.4 ベイズ線形回帰とモデル選択 / Baysian Linear Regression and Model Comparison)
PRML 3.3.3-3.4 ベイズ線形回帰とモデル選択 / Baysian Linear Regression and Model Comparison)Akihiro Nitta
 
多項式あてはめで眺めるベイズ推定 ~今日からきみもベイジアン~
多項式あてはめで眺めるベイズ推定~今日からきみもベイジアン~多項式あてはめで眺めるベイズ推定~今日からきみもベイジアン~
多項式あてはめで眺めるベイズ推定 ~今日からきみもベイジアン~ tanutarou
 
3分でわかる多項分布とディリクレ分布
3分でわかる多項分布とディリクレ分布3分でわかる多項分布とディリクレ分布
3分でわかる多項分布とディリクレ分布Junya Saito
 
はじめてのパターン認識 第11章 11.1-11.2
はじめてのパターン認識 第11章 11.1-11.2はじめてのパターン認識 第11章 11.1-11.2
はじめてのパターン認識 第11章 11.1-11.2Prunus 1350
 
生成モデルの Deep Learning
生成モデルの Deep Learning生成モデルの Deep Learning
生成モデルの Deep LearningSeiya Tokui
 
PRML上巻勉強会 at 東京大学 資料 第1章後半
PRML上巻勉強会 at 東京大学 資料 第1章後半PRML上巻勉強会 at 東京大学 資料 第1章後半
PRML上巻勉強会 at 東京大学 資料 第1章後半Ohsawa Goodfellow
 
階層モデルの分散パラメータの事前分布について
階層モデルの分散パラメータの事前分布について階層モデルの分散パラメータの事前分布について
階層モデルの分散パラメータの事前分布についてhoxo_m
 
「3.1.2最小二乗法の幾何学」PRML勉強会4 @筑波大学 #prml学ぼう
「3.1.2最小二乗法の幾何学」PRML勉強会4 @筑波大学 #prml学ぼう 「3.1.2最小二乗法の幾何学」PRML勉強会4 @筑波大学 #prml学ぼう
「3.1.2最小二乗法の幾何学」PRML勉強会4 @筑波大学 #prml学ぼう Junpei Tsuji
 
クラシックな機械学習入門:付録:よく使う線形代数の公式
クラシックな機械学習入門:付録:よく使う線形代数の公式クラシックな機械学習入門:付録:よく使う線形代数の公式
クラシックな機械学習入門:付録:よく使う線形代数の公式Hiroshi Nakagawa
 
曲線から多様体まで駆け抜ける微分幾何学入門
曲線から多様体まで駆け抜ける微分幾何学入門曲線から多様体まで駆け抜ける微分幾何学入門
曲線から多様体まで駆け抜ける微分幾何学入門Masanari Kimura
 
PRML復々習レーン#2 2.3.6 - 2.3.7
PRML復々習レーン#2 2.3.6 - 2.3.7PRML復々習レーン#2 2.3.6 - 2.3.7
PRML復々習レーン#2 2.3.6 - 2.3.7sleepy_yoshi
 
制限ボルツマンマシン入門
制限ボルツマンマシン入門制限ボルツマンマシン入門
制限ボルツマンマシン入門佑馬 斎藤
 

Mais procurados (20)

Chapter2.3.6
Chapter2.3.6Chapter2.3.6
Chapter2.3.6
 
パターン認識と機械学習 §6.2 カーネル関数の構成
パターン認識と機械学習 §6.2 カーネル関数の構成パターン認識と機械学習 §6.2 カーネル関数の構成
パターン認識と機械学習 §6.2 カーネル関数の構成
 
PRML 3.3.3-3.4 ベイズ線形回帰とモデル選択 / Baysian Linear Regression and Model Comparison)
PRML 3.3.3-3.4 ベイズ線形回帰とモデル選択 / Baysian Linear Regression and Model Comparison)PRML 3.3.3-3.4 ベイズ線形回帰とモデル選択 / Baysian Linear Regression and Model Comparison)
PRML 3.3.3-3.4 ベイズ線形回帰とモデル選択 / Baysian Linear Regression and Model Comparison)
 
Stanでガウス過程
Stanでガウス過程Stanでガウス過程
Stanでガウス過程
 
多項式あてはめで眺めるベイズ推定 ~今日からきみもベイジアン~
多項式あてはめで眺めるベイズ推定~今日からきみもベイジアン~多項式あてはめで眺めるベイズ推定~今日からきみもベイジアン~
多項式あてはめで眺めるベイズ推定 ~今日からきみもベイジアン~
 
3分でわかる多項分布とディリクレ分布
3分でわかる多項分布とディリクレ分布3分でわかる多項分布とディリクレ分布
3分でわかる多項分布とディリクレ分布
 
はじめてのパターン認識 第11章 11.1-11.2
はじめてのパターン認識 第11章 11.1-11.2はじめてのパターン認識 第11章 11.1-11.2
はじめてのパターン認識 第11章 11.1-11.2
 
Prml 2.3
Prml 2.3Prml 2.3
Prml 2.3
 
生成モデルの Deep Learning
生成モデルの Deep Learning生成モデルの Deep Learning
生成モデルの Deep Learning
 
PRML上巻勉強会 at 東京大学 資料 第1章後半
PRML上巻勉強会 at 東京大学 資料 第1章後半PRML上巻勉強会 at 東京大学 資料 第1章後半
PRML上巻勉強会 at 東京大学 資料 第1章後半
 
階層モデルの分散パラメータの事前分布について
階層モデルの分散パラメータの事前分布について階層モデルの分散パラメータの事前分布について
階層モデルの分散パラメータの事前分布について
 
PRML第3章@京大PRML輪講
PRML第3章@京大PRML輪講PRML第3章@京大PRML輪講
PRML第3章@京大PRML輪講
 
PRML 4.1.6-4.2.2
PRML 4.1.6-4.2.2PRML 4.1.6-4.2.2
PRML 4.1.6-4.2.2
 
「3.1.2最小二乗法の幾何学」PRML勉強会4 @筑波大学 #prml学ぼう
「3.1.2最小二乗法の幾何学」PRML勉強会4 @筑波大学 #prml学ぼう 「3.1.2最小二乗法の幾何学」PRML勉強会4 @筑波大学 #prml学ぼう
「3.1.2最小二乗法の幾何学」PRML勉強会4 @筑波大学 #prml学ぼう
 
prml4.1.3-4.1.4
prml4.1.3-4.1.4prml4.1.3-4.1.4
prml4.1.3-4.1.4
 
クラシックな機械学習入門:付録:よく使う線形代数の公式
クラシックな機械学習入門:付録:よく使う線形代数の公式クラシックな機械学習入門:付録:よく使う線形代数の公式
クラシックな機械学習入門:付録:よく使う線形代数の公式
 
曲線から多様体まで駆け抜ける微分幾何学入門
曲線から多様体まで駆け抜ける微分幾何学入門曲線から多様体まで駆け抜ける微分幾何学入門
曲線から多様体まで駆け抜ける微分幾何学入門
 
PRML復々習レーン#2 2.3.6 - 2.3.7
PRML復々習レーン#2 2.3.6 - 2.3.7PRML復々習レーン#2 2.3.6 - 2.3.7
PRML復々習レーン#2 2.3.6 - 2.3.7
 
WAICとWBICのご紹介
WAICとWBICのご紹介WAICとWBICのご紹介
WAICとWBICのご紹介
 
制限ボルツマンマシン入門
制限ボルツマンマシン入門制限ボルツマンマシン入門
制限ボルツマンマシン入門
 

Semelhante a Rの環境とスコープ

言語処理系入門€5
言語処理系入門€5言語処理系入門€5
言語処理系入門€5Kenta Hattori
 
RubyとJavaScriptに見る第一級関数
RubyとJavaScriptに見る第一級関数RubyとJavaScriptに見る第一級関数
RubyとJavaScriptに見る第一級関数Altech Takeno
 
R6パッケージの紹介―機能と実装
R6パッケージの紹介―機能と実装R6パッケージの紹介―機能と実装
R6パッケージの紹介―機能と実装__nakamichi__
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Ransui Iso
 
PythonでLispを実装した (evalつき)
PythonでLispを実装した (evalつき)PythonでLispを実装した (evalつき)
PythonでLispを実装した (evalつき)t-sin
 
Web技術勉強会 20110723
Web技術勉強会 20110723Web技術勉強会 20110723
Web技術勉強会 20110723龍一 田中
 

Semelhante a Rの環境とスコープ (7)

言語処理系入門€5
言語処理系入門€5言語処理系入門€5
言語処理系入門€5
 
RubyとJavaScriptに見る第一級関数
RubyとJavaScriptに見る第一級関数RubyとJavaScriptに見る第一級関数
RubyとJavaScriptに見る第一級関数
 
R6パッケージの紹介―機能と実装
R6パッケージの紹介―機能と実装R6パッケージの紹介―機能と実装
R6パッケージの紹介―機能と実装
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
PythonでLispを実装した (evalつき)
PythonでLispを実装した (evalつき)PythonでLispを実装した (evalつき)
PythonでLispを実装した (evalつき)
 
Web技術勉強会 20110723
Web技術勉強会 20110723Web技術勉強会 20110723
Web技術勉強会 20110723
 

Mais de Itoshi Nikaido

第1回HPC OPS研究会 Opening Remarks
第1回HPC OPS研究会 Opening Remarks第1回HPC OPS研究会 Opening Remarks
第1回HPC OPS研究会 Opening RemarksItoshi Nikaido
 
BioDevOpsによる再現性のあるバイオインフォマティクス環境の構築
BioDevOpsによる再現性のあるバイオインフォマティクス環境の構築BioDevOpsによる再現性のあるバイオインフォマティクス環境の構築
BioDevOpsによる再現性のあるバイオインフォマティクス環境の構築Itoshi Nikaido
 
Reading circle of Epigenome Roadmap: Roadmap Epigenomics Consortium et. al. I...
Reading circle of Epigenome Roadmap: Roadmap Epigenomics Consortium et. al. I...Reading circle of Epigenome Roadmap: Roadmap Epigenomics Consortium et. al. I...
Reading circle of Epigenome Roadmap: Roadmap Epigenomics Consortium et. al. I...Itoshi Nikaido
 
Bioinformatics Analysis Environment for Your Laboratory Use
Bioinformatics Analysis Environment for Your Laboratory UseBioinformatics Analysis Environment for Your Laboratory Use
Bioinformatics Analysis Environment for Your Laboratory UseItoshi Nikaido
 
DevOpsとcloudで達成する再現性のあるDNAシーケンス解析とスーパーコンピューティング
DevOpsとcloudで達成する再現性のあるDNAシーケンス解析とスーパーコンピューティングDevOpsとcloudで達成する再現性のあるDNAシーケンス解析とスーパーコンピューティング
DevOpsとcloudで達成する再現性のあるDNAシーケンス解析とスーパーコンピューティングItoshi Nikaido
 
0.1 pg の mRNA をシーケンスする高精度なRNA-Seq法: Quartz-Seq
0.1 pg の mRNA をシーケンスする高精度なRNA-Seq法: Quartz-Seq0.1 pg の mRNA をシーケンスする高精度なRNA-Seq法: Quartz-Seq
0.1 pg の mRNA をシーケンスする高精度なRNA-Seq法: Quartz-SeqItoshi Nikaido
 
Rのオブジェクト
RのオブジェクトRのオブジェクト
RのオブジェクトItoshi Nikaido
 
いつも側にいるコラボレータ Google+を使った共同研究の進め方
いつも側にいるコラボレータ Google+を使った共同研究の進め方いつも側にいるコラボレータ Google+を使った共同研究の進め方
いつも側にいるコラボレータ Google+を使った共同研究の進め方Itoshi Nikaido
 

Mais de Itoshi Nikaido (9)

第1回HPC OPS研究会 Opening Remarks
第1回HPC OPS研究会 Opening Remarks第1回HPC OPS研究会 Opening Remarks
第1回HPC OPS研究会 Opening Remarks
 
BioDevOpsによる再現性のあるバイオインフォマティクス環境の構築
BioDevOpsによる再現性のあるバイオインフォマティクス環境の構築BioDevOpsによる再現性のあるバイオインフォマティクス環境の構築
BioDevOpsによる再現性のあるバイオインフォマティクス環境の構築
 
Reading circle of Epigenome Roadmap: Roadmap Epigenomics Consortium et. al. I...
Reading circle of Epigenome Roadmap: Roadmap Epigenomics Consortium et. al. I...Reading circle of Epigenome Roadmap: Roadmap Epigenomics Consortium et. al. I...
Reading circle of Epigenome Roadmap: Roadmap Epigenomics Consortium et. al. I...
 
Bioinformatics Analysis Environment for Your Laboratory Use
Bioinformatics Analysis Environment for Your Laboratory UseBioinformatics Analysis Environment for Your Laboratory Use
Bioinformatics Analysis Environment for Your Laboratory Use
 
DevOpsとcloudで達成する再現性のあるDNAシーケンス解析とスーパーコンピューティング
DevOpsとcloudで達成する再現性のあるDNAシーケンス解析とスーパーコンピューティングDevOpsとcloudで達成する再現性のあるDNAシーケンス解析とスーパーコンピューティング
DevOpsとcloudで達成する再現性のあるDNAシーケンス解析とスーパーコンピューティング
 
0.1 pg の mRNA をシーケンスする高精度なRNA-Seq法: Quartz-Seq
0.1 pg の mRNA をシーケンスする高精度なRNA-Seq法: Quartz-Seq0.1 pg の mRNA をシーケンスする高精度なRNA-Seq法: Quartz-Seq
0.1 pg の mRNA をシーケンスする高精度なRNA-Seq法: Quartz-Seq
 
Rのオブジェクト
RのオブジェクトRのオブジェクト
Rのオブジェクト
 
ENCODE勉強会
ENCODE勉強会ENCODE勉強会
ENCODE勉強会
 
いつも側にいるコラボレータ Google+を使った共同研究の進め方
いつも側にいるコラボレータ Google+を使った共同研究の進め方いつも側にいるコラボレータ Google+を使った共同研究の進め方
いつも側にいるコラボレータ Google+を使った共同研究の進め方
 

Rの環境とスコープ

Notas do Editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n