AllenNLPなどは動作している(本記事ではRを「パッケージ」とPythonを「ライブラリ」という風に書き分けています)前書き有用なライブラリがPythonで開発されているため使いたくなりますが、Pythonはわからない・書けないというRユーザーは未だに多くいらっしゃいます。あるPythonライブラリの関数にデータを適用した結果だけが欲しいのであれば、reticulateパッケージで事足りてしまうようです。同様のパッケージには以前に紹介したPythonInRやrPythonなどがありますが、reticulateがリリースされてからは私はこちらを用いています(kerasパッケージが公開前に行ったreticulateでKerasを使って画像生成する記事でも使用しています)。「PythonInRパッケージの記事を参考にしました!」と言われて「すみません、私はもう使っていないです」と答えるのもとても心苦しいですので、reticulateパッケージの使い方や利用例などを実行して確認する形でまとめました(主に自分用)。reticulateパッケージは、RStudio社がRに対応していないTensorFlowをPythonから呼ぶためにtensorflowパッケージ内で実装していた変換部分(libpython)を中心に別パッケージにしたという認識です。tensorflow::importでRからgensimを使う記事を書いてもいますが、0.5から0.6になるタイミングでtensorflowパッケージのimportはreticulateに移行しています。RとPython間を扱うための様々な関数が用意しており、RからPythonを活用するためのパッケージの決定版と言えそうです。不安定な部分や癖がありますが、手懐けられればできる幅は広がるでしょう。公式ページにはすでに有用な情報が豊富にあり、本記事でも参考にしていますのでreticulateパッケージに興味が出たらぜひともお読みください。Pythonreticulateを使うRユーザーがreticulateパッケージを使う目的は次の2種類に分類できるでしょう。PythonをRで書きたい(RでPythonを扱う)Pythonで書かれたライブラリをRで利用したい(すでにあるライブラリ・関数をRで利用する)主な用途は後者と想定されます。これは使いたいPythonライブラリをインポートして、すでに用意できたデータを関数に当てはめるだけならそれほど難しくありません。基本手順あらかじめ準備が必要になりますので、後述の「事前準備」の章を参考に設定しておきましょう。事前準備を済ませてreticulateパッケージでPythonが呼び出せる状態にできたら、次のコードのようにインポートしたPythonオブジェクトのクラスやその中の関数などに$演算子を用いてアクセスします。これが基本的な手順になります。columns]このくらいの簡単な処理なら、RとPython間のデータ型の変換やreticulateパッケージで定義されている関数などを詳しく知らなくてもこなせるでしょう。適用したいPython関数の入力として適した形にデータを適宜変換したり、得られた結果のPythonオブジェクトをRに戻すという処理を繰り返すなら、RでPythonを扱う方法を知っておくことをおすすめします。以降の節では「RでPythonを扱う方法」と、「既存のPython関数・ライブラリをRで利用する」に分けて説明します。読み通すことを推奨しますが、長くなってしまったため必要と興味に応じて読み進めるといいでしょう。事前準備へPythonライブラリの利用例から知りたい方ライブラリ利用例へ「変換や関数の使い方を知っておきたい・全体を通して見たい」という方そのまま進むRでPythonを扱うPythonとRでは構文はもちろん、定義されているデータ構造や組み込み関数が違います。Rにはスカラー型はなく「長さが1のベクトル」と考えたり、Pythonでは行列やデータフレームはNumpyやPandasを用いて拡張したり、Rの「NULL」はPythonでは「None」に対応します。Pythonでよく用いられるイテレータ・ジェネレータも、Rではあまり使われません(iteratorsパッケージを用いたり、R6クラスによる定義などで実装は可能)。これらの違いをよしなに扱う処理や関数群がreticulateパッケージで提供されています。本節ではそれらの関数を対応するオブジェクトに実行した結果を提示しながら、挙動を確かめます。reticulateにおけるPythonオブジェクトの扱い方reticulateパッケージでRオブジェクトを入力としてPythonを呼び出すと、入力されたRオブジェクトは次の表の通りに対応するPythonのデータ型・データ構造に自動的に変換されます(Python側からR側に値を返す際も同様。こちらの表は公式サイトより)。FALSEこのようにR-Python間でオブジェクトは自動変換されますが、Python側に期待通りのオブジェクトを与えて処理させるためにR側で明示的に変換させたい場合もあります。そのような要求を満たすには、reticulateパッケージで定義されている関数を用いると良いでしょう。r_to_py()は「RオブジェクトをPythonへ」、py_to_r()は「PythonオブジェクトをRへ」、相互変換するreticulateパッケージの関数です。これらを用いて動作例を示します。リストとタプル変換対応を示した表にある通り、Pythonにおける「リスト(List)」はRではベクトルに相当します。前述の通り、Rにはデータ型としてスカラーがないため、Pythonのリストを入力すべきPythonの関数に「長さが1のベクトル」を渡すとPython側でスカラーに変換され、リストを想定していた後続処理ができない場合もあります。あいうタプル(Tuple)は変更不可(immutable)なPythonのリストです。要素の追加・変更・削除ができないオブジェクトにできるため、定数定義や後述の辞書のキーなどに用いるそうです。types)」が変換されるとありますが、Pythonのタプルを変換するとR側では「複数の型を含むリスト」になりますが、逆ができないようです。tuple()でこなせますので、現時点ではこちらを使うのが良いでしょう。method辞書Pythonにおける「辞書」とはキーと値のペアからなるオブジェクトです(他の言語では「連想配列」や「ハッシュ」と呼ばれます)。Rの名前付きリストに相当し自動変換されますが、dict()で明示的に作成できます。Rでは馴染みがないかもしれませんが(下記リンクにRでの実現例)、単語の出現頻度を素性に用いる言語処理では単語と頻度を対にしたハッシュテーブルはたびたび用いられます。'b']配列とデータフレームRにおける行列・配列はNumpyを用いたN次元配列が対応します。このとき、入力したRオブジェクトの次元数によってPythonにおける配列の形状が変わります。np_array()で明示的に作成でき、ベクトルに対してnp_array()で1次元配列に変換することも可能です。配列に関しては、RとPython間でデータの持たせ方や表示が異なって困惑する場合もあります。知っておいた方が良い点や注意事項などが公式ページで詳しく書いてありますので、読んでおくといいでしょう。12]]RにおけるデータフレームはPandasを用いたデータフレームが対応します。このとき、数値や文字列などの型はNumpyの配列(ndarray)に変換するときと同じルールに基づいていますが、因子(factor)とPOSIXct型については以下の対応がされています。datetime64[ns])このように個別処理されますが、変換は現状あまりうまくできていないように思えます(こちらは今後に期待しましょう)。壊れたデータフレームです。「文書を行」に「単語を列」に単語出現頻度を値とした文書単語行列(単語と文書を転置した単語文書行列でも)は言語処理で用いられますが、単語の出現頻度はドキュメントで偏りがあるために0が非常に多い行列になります(単語数だけの次元を確保するためにサイズが巨大な行列にもなりやすい)。このような値がなくてスカスカな行列は疎行列と呼ばれ、通常と同じくデータを持つと大量にメモリを消費する上に演算時間もかかります。そのため、疎行列を適した形に圧縮して扱う必要があります。Rで疎行列を扱うにはSparseM/Matrixパッケージがあります。このうちMatrixパッケージはR自体と合わせてインストールされます(ただし、baseやgraphicsなどと異なり使用時には呼び出す必要があります。Packages」はR-3.5.1ではこちらのリンク先にあるパッケージが対象になります)。Columns)形式の疎行列に変換されます。Scipyが扱う疎行列の内部構造に関しては以下のサイトなどをご参考ください。1.31150214281関数Rで定義した関数をラップし、Python側で関数定義して実行できる形にするにはpy_func()を用います。このとき、定義するRの関数にはPythonと互換性がない構文は含められません。複雑な関数の定義は向かず、今のところ私は用途が思い当たりませんが、いいアイデアがあれば教えて欲しいです。Python関数を事前に定義したファイルから読み込んだり自前で書いて実行したりして、Rで利用する方法は別節にて扱います。3.0Pythonを書くR-Python間の変換ルールとオブジェクトの扱い方についてわかってきたと思いますが、イテレータやライブラリ固有の型など、Rにそのままでは変換できない結果をPython関数が返す場合は数多くあります。Python実行結果をRに変換できるオブジェクトにしていくためにも、Python組み込み関数やPythonでよく使われる技法を知っておくことは重要でしょう。Python組み込み関数を使うPython組み込みの関数群にRからアクセスするにはimport_builtins()を使用します。import_builtins()の中では「"builtins"をimport()の引数に与えた処理」を行っているので、import()と同様に$演算子で関数が利用できます。実際にPython組み込み関数をいくつか用いてみましょう。function)のひとつであるwithを使うことで、Pythonと同じようにコンテキストマネージャオブジェクトを操作できます。こちらでもPythonの組み込み関数を組み合わせられます。there!"イテレータ先ほどのPython組み込み関数をRで利用するときに出てきましたが、Rではあまり使われないイテレータはPythonでしばしば用いられます。イテレータにより、あらかじめ大きいデータを生成せずにループ処理を実行したり、無限に呼び出せるオブジェクトを生成することなどができます。reticulateパッケージにはPythonイテレータオブジェクトを扱う関数も用意されており、先のように自前で定義しなくても良い場合もあります。ここではreticulateパッケージでPythonイテレータオブジェクトを処理する例と合わせ、R内で実現する例も提示します。9Rでイテレータを扱うにはiteratorsパッケージを活用するのがよいでしょう。こちらとforeachパッケージを組み合わせることで、大規模なループ処理を実行するのに用いられます。Rにおけるイテレータに関する話は下記資料などをご参考に(イテレータについてはP20以降)。Openは「additionalPackages」にdoParallelパッケージが含まれており、依存パッケージであるiteratorsパッケージも一緒にインストールされます。values保存とロードreticulateパッケージで処理・作成されたPythonオブジェクトの保存と読み込みを行いたいときは、py_save_object()とpy_load_object()が使えます。これらの関数ではPython標準ライブラリであるpickleモジュールを用いて、ローカルファイルに対してPythonオブジェクトの管理をします。0.2保存したファイルはPythonからも読み込めます。0.2まとめRとPython間のデータ型・データ構造などの違いを知り、reticulateパッケージで定義された各種関数で適宜扱うことで、RからPythonをインタラクティブに利用できるようになってきたと思います。変換対応していないオブジェクトへの四則演算(各演算子を関数に変換すれば対応できる場合も場合も)やPythonにおけるスライスの部分配列へのアクセス、Rが対応していない構文もあります(zeallotパッケージや演算子定義で対応可能なものもある)。知っておくべきこともまだありますが、実際に使って慣れていくのが良いでしょう。etc.?既存のPython関数・ライブラリをRで活用する前節ではRでPythonを扱うためにreticulateパッケージの関数について挙動を試しましたが、元々の目的は「すでにあるPythonライブラリや関数などをRで利用すること」です。本節ではPythonコード・関数を評価・実行してR側で結果を得る方法に関して解説し、続いていくつかのライブラリについて簡単な利用例を記載することで活用手順を説明します。Pythonコードの実行RでPythonコードを評価し結果を得るアプローチには、「文字列に書かれたPythonコードの実行」と「ファイルに書かれたPythonコードの実行」があります。前者は自前でPythonを書く機会は多くなるでしょうが、後者は使い方次第で結果だけを利用することも可能です。文字列に書かれたPythonコードの実行Rの文字列として記述した簡素なPythonコードを評価し、結果を受け取るにはpy_eval()があります。この関数は書けるコード量が限られて変数定義もできないですが(あくまでも実行結果を受け取る用途と思われる)、同じように文字列をPythonコードとして実行するpy_run_string()と合わせたりすると有効に使えます(ただし、グローバル汚染には注意しましょう)。'l_pth'ファイルに書かれたPythonコードの実行さほど長くなくシンプルなPythonコードであれば、前述のpy_run_string()で文字列として与えて実行するだけでも許されるかもしれません。可読性とメンテナンス性などを考えたらPythonコードを別ファイルとして保存しておいた方が良いでしょう。別ファイルに定義されたPythonコードを実行してR上で利用できるようにする関数には、py_run_file()があります。こちらもpy_run_string()と同様にデフォルトでは「main」で実行されます。以下ではscikit-learnを用いたロジスティック回帰による分類モデルを学習するPythonスクリプトファイルを作成しておき、その実行結果に対してRでのデータ当てはめを試みます(目的は利用確認であるので、なんの工夫もなく全データで学習しています)。前節にて文字列や別ファイルに書かれたPythonコードを評価して、R側から結果を得ることができました。これにより退屈なことはPythonにやらせたり、数多くいらっしゃるPython使いの方々が書いた綺麗なコードを流用できるようになりました。次はPythonライブラリを活用する手立てについてですが、こちらはクラスや関数定義が個々で異なるため、基本的な手順を示した後に実利用例ベースで触れたいと思います。AllenNLP」です。これらの簡単な例を自前で書いたり、チュートリアル内容をreticulateパッケージを用いて書き直したりします。ライブラリの詳細については、それぞれの小節毎に記載のリンクをご参考ください。例で用いたPythonライブラリはあらかじめインストールしております。Pythonライブラリを利用する基本的な手順Pythonライブラリを利用するには、本章の最初にある「基本手順」で行ったようにimport()を用います。ライブラリを読み込んだ後は目的に応じて使いたい機能を$演算子で呼び出します。sklearn$svm$SVC$fit)RStudioを利用している場合、Rパッケージ・関数名と同じように$の後に「タブ」を入力するとコード補完がされます(下図)。View()を実行することでソースパネルの別タブにデータビューアが表示され、変換可能なオブジェクトの情報を見ることができます。PythonオブジェクトにView関数を実行View(py_lr)さらにデータビューア上でカーソルを合わせ、右側に出てくる左矢印のポインタをクリックすると、下記のコマンドがコンソールにコマンドが打ち込まれて詳細が確認できます。65536)こうして利用したいPython関数を見つけ、用途に合うかも併せてドキュメントで確認し、入力データを適した形で用意できれば、あとは実行するだけとなります。それでは先ほど名前を出したライブラリについて、次節から利用例として動作させた結果を記載します。SpaCySpaCyは自然言語処理のPythonライブラリです。日本語に対応したモデルは残念ながら公開されていないために本格的な解析は難しそうというのが個人の感想ですが、言語処理で使われる様々な機能が実装されています。SpaCyに関しては、すでにreticulateを用いたspacyrパッケージがCRAN公開されていますが(ただし、reticulateパッケージでconda環境を利用している必要があります)、実行例として公式を参考に簡単な英文解析を行います。Pieceは「ニューラル言語処理向けのトークナイザー」です。詳細は作者本人による解説記事に丁寧に書いてありますので、そちらをご覧ください。MeCabやKyTeaなどと目的や課題意識が違う点はしっかり認識しておきましょう。今回は大きくないテキストで学習を試し、そのモデルを用いて文分割ができるまでを確認しています。