パッケージと名前空間

ディフェンシブRプログラミング

Dr. Colin Gillespie

Jumping Rivers

グローバル環境

  • 既定の環境は .GlobalEnv です
  • オブジェクトは環境に保存されます
  • 中身を見るには ls() を使います
  • この環境はすぐ一杯になります
  • オブジェクトを取り違えやすくなります
n
# それとも欲しかったのは
N
ディフェンシブRプログラミング

パッケージと環境

  • パッケージは名前用の空間「名前空間」を使います
    • 名前空間はパッケージを入れる箱と考えられます
  • 名前空間は整理整頓に役立ちます
    • フォルダのようなものです
ディフェンシブRプログラミング

エクスポートされた関数

  • library() はこのパッケージの箱に直接アクセスします
  • library("dplyr")dplyr のエクスポート関数に直接アクセスします
## 238 exported functions
getNamespaceExports("dplyr")
  • 代わりに :: で関数に直接アクセスできます
## dplyr の filter 関数
dplyr::filter
ディフェンシブRプログラミング

同名の関数

  • ときどき、同名の関数が別パッケージにあります
## filter() 関数
stats::filter()
dplyr::filter()
  • filter() とだけ打つと、どちらが呼ばれますか?
  • パッケージの読み込み順に依存します!
ディフェンシブRプログラミング

同名の関数

  • search() で確認できます
search()
# [1] ".GlobalEnv"         "package:dplyr"      "package:stats"  
# <Other packages>
ディフェンシブRプログラミング

守りを固める

名前空間の衝突は厄介なだけではありません

  • 診断しにくいバグの原因になります
ディフェンシブRプログラミング

conflicted パッケージは、関数の選択を明示的にします

library("conflicted")
library("dplyr")
filter
#Error: [conflicted] `filter` found in 2 packages.
#Either pick the one you want with `::` 
# * dplyr::filter
# * stats::filter
#Or declare a preference with `conflict_prefer()`
# * conflict_prefer("filter", "dplyr")
# * conflict_prefer("filter", "stats")
ディフェンシブRプログラミング

そろそろ起きよう

ディフェンシブRプログラミング

Preparing Video For Download...