LoginSignup
13
15

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-03-04

背景

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()

scatter_py.png

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()

scatter_r.png

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で選択したインタプリタがデフォルトで選択されているようです。

13
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
15