Slide 1

Slide 1 text

R⾔語と Go⾔語 @y__mattu 2021-07-03 Tokyo.R #93 応⽤セッション

Slide 2

Slide 2 text

誰︖ • 松村優哉 • 出⾝: 計量経済、ベイズ統計、 因果推論 • お仕事: データサイエンティストと データエンジニア in HR Tech企業 • ⾔語: R, Python, Go←New! • Tokyo.R運営(初⼼者セッションとか) • 近況: useR! 2021のお⼿伝い (7/5-9)

Slide 3

Slide 3 text

宣伝 Rユーザのための RStudio[実践]⼊⾨ 第2版 好評発売中!!

Slide 4

Slide 4 text

宣伝2 WEB+DB PRESS vol.123 好評発売中!! Nob Data(株)の⼤城さんとの インタビューが掲載されました

Slide 5

Slide 5 text

今⽇のお話 • Go⾔語とは • 私とGo⾔語 • RでGoの関数を呼び出す⽅法 • ⼩話

Slide 6

Slide 6 text

今⽇話さないこと • Go⾔語の何が素晴らしいか • Go⾔語の⽂法 • Rパッケージ内にGo⾔語の関数を組み込む⽅法 • Go⾔語からRを呼ぶ⽅法

Slide 7

Slide 7 text

Go⾔語とは • Google が開発したプログラミング⾔語 • 「Go⾔語」や「Golang」と表記される • コンパイル型の⾔語 • 並列処理に強いと⾔われている • ⼀節では「進化したC⾔語」 • 環境依存が少ない • Gopherくんかわいい

Slide 8

Slide 8 text

私とGo⾔語 • お仕事: データエンジニアリングで「使えたら幅が広がりそう」と 思う場⾯があった • 趣味: とあるC++製のライブラリを使ってみようと思ったらMacだ とビルドでコケる • C++ライブラリならRから呼べる • Linuxの特定の環境下でしか動かなかった →もう少しいろんな環境で動く⾔語に移植しよう • 昔々、こんな記事を書いたことも

Slide 9

Slide 9 text

はじめてのGo⾔語 • インストール • 公式Webページから • Go⾔語のざっくり実⾏⼿順 • .goファイルにプログラムを書く • go build コマンドでバイナリを作成 • バイナリを直接コンソールに⼊⼒

Slide 10

Slide 10 text

Hello Worldしてみる • hellowrold.go デモ mainパッケージであることの宣⾔ (Go特有の書き⽅なのでここでは気にしなくて良い) パッケージの読み込み 関数の定義

Slide 11

Slide 11 text

これをRから呼びたい • RからGoを呼ぶ⽅法 1. Goのコードを書く 2. Goの関数を呼び出すコードをC⾔語で書く 3. そのCの関数をRで呼び出す • Rustはextendrという便利なものがあるので楽そう︖ですが、Goは 今の所愚直にやるしかなさそうです。 • C++を避けるのがスタートだったのになぜか結局Cを書いているというツッコミはなしで。 • Goの関数を呼ぶだけならぶっちゃけそんなに難しくないし…

Slide 12

Slide 12 text

やってみよう • 数値で試してみる(./calc/main.go) Cパッケージをインポート (Cから呼び出すのに必要) 数値に2を×関数 フィボナッチ数列を計算する関数 (ただしこの書き⽅だと遅い) コメントアウトで //export 関数名 を書く ファイル名がmain.goなら、お約束的に書く

Slide 13

Slide 13 text

この時点でのファイル構成 ・ calc main.go

Slide 14

Slide 14 text

ビルドして、共有オブジェクトを作る C⾔語で扱う「共有オブジェクト」と呼ばれるファイル。 UNIX系OS(macOSやLinux)ではso、 Windowsではdll拡張⼦を使う

Slide 15

Slide 15 text

この時点でのファイル構成 ・ calc main.go libcalc.h libcalc.so

Slide 16

Slide 16 text

C⾔語で、Go⾔語の関数を呼ぶ関数を書く • 数値で試してみる(./rgo.c) Rから呼ぶのに必要な ヘッダーファイルの読み込み 外部から呼び出す関数を宣⾔ 関数の定義 関数⾃体はGoで書いているので、 Rから⼊ってくる⼊⼒とRへの出⼒だけ 整合性が取れるように書けばOK

Slide 17

Slide 17 text

この時点でのファイル構成 ・ calc main.go libcalc.h libcalc.so rgo.c

Slide 18

Slide 18 text

Cプログラムをコンパイルする このとき、 UNIX系OSではgccが、 WindowsではRtoolsが必要

Slide 19

Slide 19 text

この時点でのファイル構成 ・ calc main.go libcalc.h libcalc.so rgo.c rgo.o rgo.so Rから呼ぶのに必要なのはこれ

Slide 20

Slide 20 text

いよいよRから実⾏︕︕︕

Slide 21

Slide 21 text

まとめ • RからGoの関数を呼ぶことができた • 結局Cを書いてコンパイルしたけど気にしない • 逆に⾔えば、C系の⾔語に慣れている⼈ならすぐにやれそう • ただしGo⾔語の壁… • Rcppから呼べると楽しそう(Go製のプログラムをRcppで呼ぶ前例はある) • Goの強みを活かすような解析(並列実⾏とか︖)や、プロダクショ ンレベルでRを使いたいといったニーズに応えられる…かも • これからいろいろ開発がんばります • フィードバックお待ちしています︕

Slide 22

Slide 22 text

⼩話1 • RとGo⾔語の関係 • 普通にRを使っているとGoを意識することは基本ないけど、裏側で は実は結構使われていたりする 例: • RStudioサーバーのバックエンドはGo実装 • Dockerはそれ⾃体Go製のプログラム

Slide 23

Slide 23 text

⼩話2 • 実はR×Goの話は、プロジェクトとして進みそうな雰囲気があった 時期もある • RStudio社のRomain Francois • dplyrなどtidyverse系の多くの パッケージのコミッター • ただし、2018年以降は特に進展が ないっぽい https://speakerdeck.com/romainfrancois/arrow-plus-ergo-1?slide=8