tidyverseとRmiscは仲が悪い。。。

今回もRの記事です。

# tidyverseとRmisc

tidyverseはデータの可視化に優れたggplot2やパイプ演算子やグループ化、記述統計に便利なdplyrなどが詰まった「これひとつで何でも来いや」的な超便利パッケージです。

一方、ggplotを一度に表示したい場合に使うmultiplotの入ったこちらも優れたパッケージのRmisc。

どうやらこいつらの相性があまり良くないみたい、、

# 問題

一番わかりやすい問題はsummarize関数でしょうか。。

```.r
> library(tidyverse)
>
> iris %>%
+   group_by(Species) %>%
+   summarize(mean = mean(Sepal.Length),
+             .groups = "drop") #.groups = "drop"でグループを解除
# A tibble: 3 x 2
  Species     mean
  <fct>      <dbl>
1 setosa      5.01
2 versicolor  5.94
3 virginica   6.59
```

みんな大好きgroup化とsummarize関数(summariseでも構いません)ですが、通常はこう表示されるはず。。

しかしRmiscもインポートしてしまうと、、

```.r
> library(tidyverse)
> library(Rmisc)
>
> iris %>%
+   group_by(Species) %>%
+   summarize(mean = mean(Sepal.Length),
+             .groups = "drop")
      mean .groups
1 5.843333    drop
```

meanが一つしかありません。全体の平均を出しているのでしょうか。
「.groups」も列名として認識されちゃってます。。(泣
なにかよくわからないことになってしまいました。

## 原因は、、

原因はライブラリのインポート後に表示されるこれ。

```.r
> library(tidyverse) #tidyverseのメッセージは省略
> library(Rmisc)
 要求されたパッケージ lattice をロード中です 
 要求されたパッケージ plyr をロード中です 
--------------------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
--------------------------------------------------------------------------------------------------------------------------------------------

 次のパッケージを付け加えます: ‘plyr’ 

 以下のオブジェクトは ‘package:dplyr’ からマスクされています: 

     arrange, count, desc, failwith, id, mutate, rename, summarise, summarize 

 以下のオブジェクトは ‘package:purrr’ からマスクされています: 

     compact 
```

いかにも怪しげですね。
これはsummarize関数がRmiscの(plyr)の中にも同じ関数が入っていて、関数がぶつかっちゃって、上書きしますよーーーってことなんです。

なので、下のように読みこむパッケージの順番を逆にすると、plyr::summarize( )がdplyr::summarize( )によって上書きされ、うまくいくのです。(「::」については後述)

```.r
> library(Rmisc)
> library(tidyverse)
─ Attaching packages ─────────────────────────────────────────────────── tidyverse 1.3.0 ─
✓ ggplot2 3.3.2     ✓ purrr   0.3.4
✓ tibble  3.0.3     ✓ dplyr   1.0.0
✓ tidyr   1.1.0     ✓ stringr 1.4.0
✓ readr   1.3.1     ✓ forcats 0.5.0
─ Conflicts ──────────────────────────────────────────────────── tidyverse_conflicts() ─
x dplyr::arrange()   masks plyr::arrange()
x purrr::compact()   masks plyr::compact()
x dplyr::count()     masks plyr::count()
x dplyr::failwith()  masks plyr::failwith()
x dplyr::filter()    masks stats::filter()
x dplyr::id()        masks plyr::id()
x dplyr::lag()       masks stats::lag()
x dplyr::mutate()    masks plyr::mutate()
x dplyr::rename()    masks plyr::rename()
x dplyr::summarise() masks plyr::summarise()
x dplyr::summarize() masks plyr::summarize()
>
> iris %>%
+   group_by(Species) %>%
+   summarize(mean = mean(Sepal.Length),
+             .groups = "drop")
# A tibble: 3 x 2
  Species     mean
  <fct>      <dbl>
1 setosa      5.01
2 versicolor  5.94
3 virginica   6.59
```
ややこしいですよね。

メッセージによると、arrange関数やmutate関数などよく使う関数でも衝突が起こっています。関数の使用が同じなら、問題なく使えるのですが、summarize関数のようなことが起こると、、、

#　解決策

二つのライブラリを同時読み込んでしまうとエラーメッセージのようなものがたくさん表示されてしまいますし、わざわざ順番を考えるのもめんどくさい!!ので、「::」を使いましょう。

「::」は、パッケージ名を指定して、関数を呼び出します。例えば、

```.r
> dplyr::summarize()
```

このようにして使います。これを利用すれば、使いたいパッケージの使いたい関数を呼び出せるので問題なさそうですね。
install.packages( )でインストールさえしてあれば、library( )で呼び出していなくても使えます。

そのため、僕みたいに**「Rmiscはmultiplotしか使わないよ!」**なんて方は

```.r
> #library(Rmisc) は使わずに

> Rmisc::multiplot(g1, g2)
```

で十分じゃないでしょうか。

# まとめ

僕がつまずいたのはtidyverseとRmiscでしたが、パッケージは無限にあるので、他のパッケージ間でも同様のことが起こるかもしれません。

Rstudioの入力補完では、使おうとしている関数がどのパッケージのものなのか、わかるようになっています。

![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/723918/07cee3e6-1dd2-f892-5049-3a7f1f3a58ef.png)


上の画像ではsummarizeの横に{dplyr}と書かれているので、dplyrから呼び出された関数が使われようとしています。

パッケージや関数を呼び出すときには十分注意して使いましょう!!

では〜〜 ^ - ^