そもそもの疑問
シングルセル解析で必須の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を指定できる。
しかし、変な癖があり注意が必要である。
- 変なパスを渡してもエラーは出ない。しかし、R sessionを再起動するまでPythonがまったく使えなくなる。
- 前項のようにreticulateが受け付けるPython環境と受け付けないものがある。
- 呼び出すPythonのsite-packageにnumpyをインストールしていないといけない。
特に1が要注意で、失敗したらR sessionを再起動してやり直した方が良い。
reticulate::py_config()
でRから呼べるPythonのパスの一覧が見られる。
解決法
結局、virtualenvがよかろうと考え、以下のように解決した。
- pyenv, virtualenvをインストール
-
virtualenv research
で仮想環境を作成 -
source /Users/foobar/research/bin/activate
で仮想環境を起動、pip install umap-learn
などして必要なPythonパッケージをインストールする - 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