Rおじさん、Pythonistaになる
こちらをご覧ください。踏み絵ではありません。R上で地理空間データを扱うPythonモジュール、geopandasによる作図を行なっている画面です。
え、RでPythonを!?と驚かれる方もいるかもしれませんが、reticulateというRパッケージを使うことで、ほぼストレスフリーでPythonのモジュールや関数がR上で利用可能になります。先の図は次のコードによって実行されました。
library(reticulate)
# モジュールの呼び出し gpd <- import("geopandas") plt <- import("matplotlib.pyplot") # サンプルデータの読み込み world <- gpd$read_file(gpd$datasets$get_path("naturalearth_lowres")) # データセットの確認 head(world) # ではないので注意 world$head(n = 3L) # 作図と出力 world$plot() plt$show()
reticulateはRStudio社が中心となり開発されている、Pythonのモジュール、クラス、関数をRで利用可能にするRのパッケージです。
R Interface to Python • reticulate
先ほどのコードを振り返りながら、reticulateでできることを見て行きましょう。参考のためPythonでのコードを併記します。
import geopandas as gpd world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres')) world.head(3) world.plot()
Rで言う所のライブラリ(パッケージ)、Pythonモジュールはimport()
関数を使って呼び出します。Pythonと同じ関数になっているのでわかりやすいですね。
gpd <- import("geopandas") # Rのclass()でクラスを確認。Pythonモジュールとして扱われている class(gpd) # [1] 'python.builtin.module' # 'python.builtin.object'
読み込んだモジュールの関数を使うにはモジュールオブジェクト中で$
演算子を使って参照します。これによりgeopandasモジュールのサンプルデータをオブジェクトとして利用可能にします。次のコードの最初2行を見る通り、Pythonの.
をRでの参照機能をもつ$
演算子に置換しているだけです。これはとてもわかりやすいと思います。
world <- gpd$read_file(gpd$datasets$get_path("naturalearth_lowres")) world$head(n = 3L) # continent gdp_md_est geometry \ 0 Asia # 22270.0 POLYGON ((61.21081709172574 # 35.65007233330923,... 1 Africa # 110300.0 (POLYGON ((16.32652835456705 # -5.87747039146621... 2 Europe 21810.0 # POLYGON ((20.59024743010491 # 41.85540416113361,... iso_a3 name # pop_est 0 AFG Afghanistan 28400000.0 1 # AGO Angola 12799293.0 2 ALB Albania # 3639453.0 # パイプ演算子だって使えちゃう world <- # gpd$datasets$get_path('naturalearth_lowres') # %>% gpd$read_file() world$tail(n = 3L)
関数内の引数はR同様、括弧の中で引数名と値の組み合わせを指定します。
world$plot()
普段慣れている$
演算子による操作が行えるので、Pythonも怖くないですね。さらにRStudioを使っていると下の図のように、入力補完やドキュメントの内容(引数含めて)を表示してくれるので、Pythonに慣れていない私のような人間でも安心ですね。学習が捗りそうです。
しっかりとドキュメントを読みたいときは、py_help()
を使います。ここでもRStudioを使っていると、ドキュメントの参照が手軽で良いですね。
py_help(world$tail)
Python環境の切り替え
Pythonを使っていて悩ましい問題の一つが、2系と3系を始めとした複数環境の切り替えです。reticulateではuse_python()
を始めとして、condaや仮想環境下のdocker(bhaskarvkさんの野心的なプロジェクトを参照)でのPythonも実行できるようになっています。例を見てみましょう。
実際のPython環境の切り替えは、Rのセッション中にimport()
が実行されたタイミングで行われます。そのため次のコードは一度Rセッションを終了してから再度実行しているものになります。
sys <- import("sys") sys$version # [1] '3.6.1 |Anaconda 4.4.0 (x86_64)| # (default, May 11 2017, 13:04:09) # \n[GCC 4.2.1 Compatible Apple LLVM 6.0 # (clang-600.0.57)]' library(reticulate) use_python("/usr/bin/python") sys <- import("sys") sys$version # [1] 2.7.13 (default, Jul 15 2017, # 12:14:18) \n[GCC 4.2.1 Compatible # Apple LLVM 8.1.0 (clang-802.0.42)] library(reticulate) use_condaenv("py36con", conda = "/Users/uri/.pyenv/versions/anaconda3-4.4.0/bin/conda", required = TRUE) sys <- import("sys") sys$version # [1] '3.6.1 |Anaconda 4.4.0 (x86_64)| # (default, May 11 2017, 13:04:09) # \n[GCC 4.2.1 Compatible Apple LLVM 6.0 # (clang-600.0.57)]'
どの環境を利用するかには優先順位があるようで、use_*()
により指定された環境、Sys.setenv(RETICULATE_PYTHON)
でのパス、Sys.which('python')
により見つかるパス、慣用的にPythonが配置されるパスだそうです。都度use_*()
を実行するのも手間なので、Sys.setenv()
に値を記述しておくと良いかもしれません。なお、RStudioでのSys.which('python')
の参照先は2系になるらしいので注意です(それでハマった)。
その他にも
reticulateパッケージの良いところは他にもあって、
が代表的な機能です。
RodeoやらPyCharmやら色々とPythonの開発環境を試しましたが、RStudioに慣れすぎていてRStudio依存になってしまっているのでreticulate、すごく助かります。
より詳しいことはRStudioがvignettesを書いているのでそちらを見ていただきたいのですが、nakamichiさんが翻訳してくださっているのでそちらも是非!ちなみにですがnakamichiさんは他にもたくさんのvignettesを多数翻訳していらっしゃいます。
少しずつですが、reticulateによるPythonの利用を前提にしたRパッケージも増えてきました (例 docker, tensorflow, , RQGIS)。今後ますます、RとPythonの連携による実現領域が広がっていくことが期待できますね。Pythonとのインターフェイスを用意してくれるRStudio最高!PythonとR仲良くしようね!
Enjoy!!