Rで関数の前に::をつけるのなんで?

R/Rstudio

Rで分析をしている際に、参考書などでは実行する関数の直前にコロン(:)が2つついている場合があります。

例えば、以下のような形です。

 dplyr::select(変数1,変数2…変数n, data=dat)

これは、dplyrパッケージの中にあるselect関数を使用するということですが、もちろん、パッケージを事前にlibrary()で宣言していれば、セミコロン2つをつけなくても、関数名を出すだけで実行することはできます。

そのため、なぜ、::をつける必要があるのか最近までいまいちわかっていませんでしたが、最近、分析していてようやく、その理由が実感できたのでメモっておきます。

コロン2つ(::)はどのパッケージの関数なのかを明示するために書く

結論ですが、コロン2つ(::)を使うのはどのパッケージの関数なのかを明示するために使います。
先ほど記載した通り、以下のような形で書きます

パッケージ名 :: 関数~

なぜ、この記述が必要なのかというと、install.packagesで追加するパッケージの中には、同じ名称で違う機能を持った関数がいくつも存在するためです。

どういうことかというと、例えば、alphaというオブジェクトは、綺麗なグラフを作ることができるggplot2パッケージでは、グラフの色の透明度を表す関数です。
(alpha =0.5 とかで透明度を調整できます)

一方で、心理学系分野で人気(?)のpsychパッケージでは、同じ名前のalphaというオブジェクトは内的整合性の信頼係数であるα係数を調べるための関数が割り当てられています。
(alpha(使用変数1,2,3,…n)でα係数を算出できます)

このように、同じ名称のオブジェクトを持つパッケージを呼び出している場合は、どのパッケージのオブジェクトなのかを明示してあげる必要があります。

名前が被ってしまっているかはlibrary()で読み込んだときにわかる

それでは、上記のような被ってしまう問題が生じているかはどのようにすればわかるか。
簡単な方法としては、library()でパッケージを呼び出した時に出てくる警告などを見るとわかります。
警告が出てもパッケージ自体は正しく呼び出せているため無視しがちですが、「~からマスクされています」と出ている場合は、そのオブジェクトが被っていることがあります。

例えば、以下の場合はpsychにあるlogitはcarパッケージ、%+%とalphaはggplot2パッケージにも同じ名称のオブジェクトがあるようです。

この場合は、alphaなどを書く場合には、どのパッケージから使っているのかを明示するために、コロン2つ(::)をつける必要がありそうです。
もちろん、つけない場合でもうまく実行できる場合もありますが、おそらくパッケージを呼び出す順番が関係していると思われます。

まとめ

というわけで、Rで関数名の前にコロン2つとパッケージ名を書く理由について簡単に紹介しました。

分析をしている中で、最初は問題なく機能していた関数なのに、後で実行したらエラーが出るようになった場合は、おそらく上記の理由で呼び出したパッケージによってオブジェクトがマスクされている可能性を疑ってみるとエラーが解決するかもしれません。

タイトルとURLをコピーしました