macOS+RStudioで呼び出すPythonのバージョンを指定する

### そもそもの疑問

シングルセル解析で必須のRパッケージSeuratは`RunUMAP()`でPythonのumap-learnを呼び出している。Windows10 + anaconda + RStudioの環境では予め`pip install umap-learn`しておけば問題なく動く。
しかし、macではumapがないとエラーが出て動かない。普段、`pyenv global 3.6.8`と指定してPython3を使っており、ターミナルからPythonを起動するとumapをimportできるのだが。どうもmacのRはシステムにもともとインストールされているPython 2.7を呼び出しているようだ。

実際、RStudioから以下のPythonのスクリプトを動かすとこの通り。

__version_show.py__

```
import sys

print(sys.version_info)
```

__RStudioのコンソール__

```
> reticulate::source_python('~/Desktop/version_show.py')
sys.version_info(major=2, minor=7, micro=10, releaselevel='final', serial=0)
```
どうにかしてPython 3.系を呼び出すようにできないものか。ここから時間を浪費したので解説します。

### macに入っている色々なPython達

macには色々な形でPythonが複数入っていることが多い。色々試した結果、Rから呼べるものと呼べないものがあることがわかった。また、pyenvやanacondaがPATHを乗っ取っていても、Rは気にしないでもともとmacに入っているPythonをデフォルトで呼ぶようだ。

◯  もともとmacに入っているPython (2.7なので古すぎ)
◯  `brew install python`でインストールしたPython
✖️  `pyenv install`でインストールしたPython
◯  pyenv + virtualenvで作った仮想環境
✖️  conda createで作った仮想環境

### reticulateには癖がある

RからPythonを呼び出す仕組みはreticulateパッケージで実装されている。`reticulate::use_python("/usr/local/bin/python3")`と唱えるとRから呼び出すPythonを指定できる。
しかし、変な癖があり注意が必要である。
1. 変なパスを渡してもエラーは出ない。しかし、R sessionを再起動するまでPythonがまったく使えなくなる。
2. 前項のようにreticulateが受け付けるPython環境と受け付けないものがある。
3. 呼び出すPythonのsite-packageにnumpyをインストールしていないといけない。

特に１が要注意で、失敗したらR sessionを再起動してやり直した方が良い。
`reticulate::py_config()`でRから呼べるPythonのパスの一覧が見られる。

### 解決法

結局、virtualenvがよかろうと考え、以下のように解決した。

1. pyenv, virtualenvをインストール
2. `virtualenv research`で仮想環境を作成
3. `source /Users/foobar/research/bin/activate`で仮想環境を起動、`pip install umap-learn`などして必要なPythonパッケージをインストールする
4. Rプロジェクトのルートディレクトリに.Rprofileを作成、`reticulate::use_python("/Users/foobar/research/bin/python")`と書いておく。

これでRから常に仮想化したPython環境を呼び出せるようになる。StackOverflowを見ると、R+macでtensorflow Rを使う人も同じ苦しみを味わっているようだ。今後もっとシンプルになればいいのだが。

```
> sessionInfo()
R version 3.5.3 (2019-03-11)
Platform: x86_64-apple-darwin18.2.0 (64-bit)
Running under: macOS Mojave 10.14.4

Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /usr/local/Cellar/openblas/0.3.5/lib/libopenblasp-r0.3.5.dylib

locale:
[1] ja_JP.UTF-8/ja_JP.UTF-8/ja_JP.UTF-8/C/ja_JP.UTF-8/ja_JP.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] Seurat_3.0.0.9000

loaded via a namespace (and not attached):
 [1] httr_1.4.0          tidyr_0.8.3         jsonlite_1.6        viridisLite_0.3.0   splines_3.5.3       lsei_1.2-0          R.utils_2.8.0      
 [8] gtools_3.8.1        Rdpack_0.10-1       assertthat_0.2.1    ggrepel_0.8.0       globals_0.12.4      pillar_1.3.1        lattice_0.20-38    
[15] glue_1.3.1          reticulate_1.11.1   digest_0.6.18       RColorBrewer_1.1-2  SDMTools_1.1-221    colorspace_1.4-1    cowplot_0.9.4      
[22] htmltools_0.3.6     Matrix_1.2-17       R.oo_1.22.0         plyr_1.8.4          pkgconfig_2.0.2     bibtex_0.4.2        tsne_0.1-3         
[29] listenv_0.7.0       purrr_0.3.2         scales_1.0.0        RANN_2.6.1          gdata_2.18.0        Rtsne_0.15          tibble_2.1.1       
[36] ggplot2_3.1.1       ROCR_1.0-7          pbapply_1.4-0       lazyeval_0.2.2      survival_2.44-1.1   magrittr_1.5        crayon_1.3.4       
[43] R.methodsS3_1.7.1   future_1.12.0       nlme_3.1-139        MASS_7.3-51.3       gplots_3.0.1.1      ica_1.0-2           tools_3.5.3        
[50] fitdistrplus_1.0-14 data.table_1.12.2   gbRd_0.4-11         stringr_1.4.0       plotly_4.8.0        munsell_0.5.0       cluster_2.0.8      
[57] irlba_2.3.3         compiler_3.5.3      rsvd_1.0.0          caTools_1.17.1.2    rlang_0.3.4         grid_3.5.3          ggridges_0.5.1     
[64] rstudioapi_0.10     htmlwidgets_1.3     igraph_1.2.4        bitops_1.0-6        npsurv_0.4-0        gtable_0.3.0        codetools_0.2-16   
[71] R6_2.4.0            zoo_1.8-5           dplyr_0.8.0.1       future.apply_1.2.0  KernSmooth_2.23-15  metap_1.1           ape_5.3            
[78] stringi_1.4.3       parallel_3.5.3      Rcpp_1.0.1          png_0.1-7           tidyselect_0.2.5    lmtest_0.9-36  
```