2018/1/20

R Markdownは便利

  • データサイエンスのためのドキュメント作成フレームワーク

    (Authoring framework for data science)

    • 文書,Rコード,図表等が一体になった実行可能なドキュメント

    • テキストファイル(.Rmd)での容易な共有,再現性の確保

    • レポートやプレゼンテーション,インタラクティブな分析ツール等,用途は色々

R Markdownは便利

R Markdownは便利

実はR以外も書ける(SQL, Python, Bash, etc.)

  • SQL
```{sql, connection=db}
SELECT *
FROM iris LIMIT 3
```
3 records
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
5.1 3.5 1.4 0.2 setosa
4.9 3.0 1.4 0.2 setosa
4.7 3.2 1.3 0.2 setosa

R Markdownは便利

  • Python
```{python}
def fib(n):
    a, b = 1, 1
    for i in range(n-1):
        a, b = b, a + b
    return a

n = 10
print("%d番目のFibonacci数:" % n)
print(fib(n))
```
## 10番目のFibonacci数:
## 55

R Markdownは便利……じゃないかも

  • Pythonサポートは最近まで結構貧弱だった(\(\leq\) knitr v1.17)

    • チャンク毎にsystem2("python")関数でシェルからPythonを呼んでいるだけなので,チャンク間でPythonセッションが持続していない

    • Pythonコードと文書を織り交ぜて書くのが難しい

```{python}
# 関数を定義しても……
def add(x, y):
    return x + y
```
```{python}
# 別のチャンクでは使えない
print(add(1, 2))
```
running: python  -c 'print(add(1, 2))'
...
NameError: name 'add' is not defined
...

最近のR Markdown + Python

  • チャンクをまたいでPythonセッションが持続するようになった(knitr v1.18)

  • ……それだけ?

```{python}
# さっきの例が
def add(x, y):
    return x + y
```
```{python}
# 今度は動く
print(add(1, 2))
```
## 3

最近のR Markdown + Python

  • Pythonが自由に書けるだけでなく,PythonからRのオブジェクトにアクセス可能

    • ベクトル,行列等の基本的なデータ型は自動的に変換される(ただしデータフレームは無理)
```{r}
# Rのデータ構造を
r_list <- list(x = 1:5, y = letters[1:3])
r_mat  <- matrix(1:6, 2)
```
```{python}
# Pythonから使う:ベクトル(R) -> リスト(Python),リスト(R) -> 辞書(Python), 行列(R) -> numpy配列(Python)
py_list = r.r_list # rオブジェクトからRのオブジェクトにアクセス
py_mat2 = r["t(r_mat) %*% r_mat"] # Rの式の評価も可能
print(py_list)
print(py_mat2)
```
## {'x': [1, 2, 3, 4, 5], 'y': ['a', 'b', 'c']}
## [[  5.  11.  17.]
##  [ 11.  25.  39.]
##  [ 17.  39.  61.]]

最近のR Markdown + Python

  • 逆に,RからPythonのクラス,メソッド等にもアクセス可能

    • Pythonの".""$"に変えるだけで,参照クラス的に使える

    • とても便利(気持ち悪い?

```{python}
class Person:
  def hello(self):
    return "Hello, world!"
```
```{r}
py_main <- reticulate::import_main() # ?? おまじない
Person <- py_main$Person # ??

p <- Person()
print(p$hello())
```
## [1] "Hello, world!"

最近のR Markdown + Python

  • RからPythonのパッケージも使える

    • とても便利(直接Pythonを使えばいいのでは?
# scikit-learnを使う
sklearn <- reticulate::import("sklearn") # ?? おまじない再び
## 手書き数字認識のデータ
digits = sklearn$datasets$load_digits()
# サポートベクトルマシンの学習と予測
svm <- sklearn$svm
clf <- svm$SVC(gamma=0.001, C=100)
clf$fit(digits$data, digits$target)
## SVC(C=100.0, cache_size=200, class_weight=None, coef0=0.0,
##   decision_function_shape='ovr', degree=3, gamma=0.001, kernel='rbf',
##   max_iter=-1, probability=False, random_state=None, shrinking=True,
##   tol=0.001, verbose=False)
clf$predict(digits$data[1,, drop=FALSE])
## [1] 0

どうしてこうなった?

  • reticulateパッケージ by RStudio

  • RからPythonを使うパッケージの決定版かも

    • RからPython C APIを通じてPythonを使うので,Pythonセッションが持続する

    • Pythonのオブジェクトをいい感じに変換,ラップしてくれるので,

      ほぼ.$に変えるだけでPythonの機能が何でもRから使える

    • R Markdown (knitr) を reticulate::eng_python()でサポート

広がるRとPythonの世界

まとめ