Rからpythonコードを実行できるreticulateパッケージが便利


背景

RstudioでPythonを使う」で述べたように、Rstudio上で簡単にPythonを実行することができます。これだけでも便利なのですが、RとPythonの連携、例えば「Pythonのライブラリで求めた結果をRオブジェトとして格納し、ggplot2で作図する」ことができれば素敵です。reticulateはこれを可能にするRのパッケージです。

参考:How to Run Python from R Studio

環境

PC: MacBook Pro 2020
OS: macOS Catalina (10.15.5)
R : 4.0.2 (2020-06-22)
RStudio: 1.4.1103
reticulate: 1.18

方法・結果

1. reticulateパッケージのダウンロード、読み込み

通常のRパッケージと同様にinstall.packages()とlibrary()を使います。

install.packages("reticulate")
library(reticulate)

2. pythonライブラリのインポート

reticulate::import()を使ってPythonライブラリを読み込みます。変数に格納することで名前をつけることもできます。

np <- reticulate::import("numpy") #「import numpy as np」と同義
plt <- reticulate::import("matplotlib.pyplot")

3. 読み込んだライブラリの使用

pythonでは「」でメソッドを使用しますが、Rで読み込むと「$」でメソッドを使用できます。ここではnumpyを用いて乱数を生成しています。引数の型を明示しないとエラーになることがあるので注意が必要です。
下記の例ではint型を入力すべき部分がfloat型になっているとエラーが出ています。そのため、as.integer()でint型であることを明示します(Rの場合は数字の後に「L」をつけるとint型として認識するので「100L」でも動きます)。
参考:reticulate does not work with R-Data frame and fit() function from Python

#乱数を生成、メソッドを使用するには「$」、引数の型を明示
x <- np$random$rand(as.integer(100))
y <- np$random$rand(as.integer(100))

# 引数の型を明示しないとエラーになる
np$random$rand(100)
# py_call_impl(callable, dots$args, dots$keywords) でエラー: 
# TypeError: 'float' object cannot be interpreted as an integer

4. 散布図を描画

matplotlibで散布図を描画し、Rのpng関数で保存します。

png("scatter_py.png")
plt$scatter(x, y)
plt$title("Title")
plt$xlabel("x")
plt$ylabel("y")
plt$show()
dev.off()

5. ggplot2で描画する

作図はRのggplot2を使うことが多いので、numpyで生成した乱数をggplot2で描画してみます。

d <- data.frame(x = x, y = y)

png("scatter_r.png")
ggplot(data = d, aes(x = x, y = y)) +
        geom_point()
dev.off()

6. pythonコードの読み込み

自作のpythonコードを読み込むこともできます。実行すると「Hello R!」と表示するhelloR.pyを作成しました。

def helloR():
        print("hello R!")

source_python()でhelloR関数を読み込みます。

reticulate::source_python("helloR.py")
helloR()
# hello R!

補足

使用するpythonのインタプリタは導入した方法によってuse_condaenv()、use_virtualenv()、use_python()で指定します。
Rstudio1.4以上の場合はTools -> Global OptionsのPythonで選択したインタプリタがデフォルトで選択されているようです。