Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
R言語とGo言語 / R and Go
Search
松村優哉
July 03, 2021
Programming
1
920
R言語とGo言語 / R and Go
松村優哉
July 03, 2021
Tweet
Share
More Decks by 松村優哉
See All by 松村優哉
はじめての機械学習 / entrance-to-machine-learning2022
y__mattu
2
1.1k
validateパッケージでデータを検証する / Data Validation with validate package
y__mattu
0
540
rstanの環境構築 / Set Up rstan
y__mattu
1
1.1k
はじめての機械学習 / Entrance to Machine Learning
y__mattu
0
710
平均値と中央値の違いについて
y__mattu
1
840
dplyr 1.0.0の新機能 / dplyr 1.0.0
y__mattu
2
9.8k
Other Decks in Programming
See All in Programming
もう僕は OpenAPI を書きたくない
sgash708
5
1.7k
AIの力でお手軽Chrome拡張機能作り
taiseiue
0
170
Ruby on cygwin 2025-02
fd0
0
150
Boost Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
300
ファインディLT_ポケモン対戦の定量的分析
fufufukakaka
0
720
コミュニティ駆動 AWS CDK ライブラリ「Open Constructs Library」 / community-cdk-library
gotok365
2
130
なぜイベント駆動が必要なのか - CQRS/ESで解く複雑系システムの課題 -
j5ik2o
10
3.7k
color-scheme: light dark; を完全に理解する
uhyo
3
360
CI改善もDatadogとともに
taumu
0
120
pylint custom ruleで始めるレビュー自動化
shogoujiie
0
120
『GO』アプリ バックエンドサーバのコスト削減
mot_techtalk
0
140
Lottieアニメーションをカスタマイズしてみた
tahia910
0
130
Featured
See All Featured
A Philosophy of Restraint
colly
203
16k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Building a Scalable Design System with Sketch
lauravandoore
461
33k
Statistics for Hackers
jakevdp
797
220k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
1k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.4k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Embracing the Ebb and Flow
colly
84
4.6k
What's in a price? How to price your products and services
michaelherold
244
12k
Music & Morning Musume
bryan
46
6.3k
How STYLIGHT went responsive
nonsquared
98
5.4k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
49k
Transcript
R⾔語と Go⾔語 @y__mattu 2021-07-03 Tokyo.R #93 応⽤セッション
誰︖ • 松村優哉 • 出⾝: 計量経済、ベイズ統計、 因果推論 • お仕事: データサイエンティストと
データエンジニア in HR Tech企業 • ⾔語: R, Python, Go←New! • Tokyo.R運営(初⼼者セッションとか) • 近況: useR! 2021のお⼿伝い (7/5-9)
宣伝 Rユーザのための RStudio[実践]⼊⾨ 第2版 好評発売中!!
宣伝2 WEB+DB PRESS vol.123 好評発売中!! Nob Data(株)の⼤城さんとの インタビューが掲載されました
今⽇のお話 • Go⾔語とは • 私とGo⾔語 • RでGoの関数を呼び出す⽅法 • ⼩話
今⽇話さないこと • Go⾔語の何が素晴らしいか • Go⾔語の⽂法 • Rパッケージ内にGo⾔語の関数を組み込む⽅法 • Go⾔語からRを呼ぶ⽅法
Go⾔語とは • Google が開発したプログラミング⾔語 • 「Go⾔語」や「Golang」と表記される • コンパイル型の⾔語 • 並列処理に強いと⾔われている
• ⼀節では「進化したC⾔語」 • 環境依存が少ない • Gopherくんかわいい
私とGo⾔語 • お仕事: データエンジニアリングで「使えたら幅が広がりそう」と 思う場⾯があった • 趣味: とあるC++製のライブラリを使ってみようと思ったらMacだ とビルドでコケる •
C++ライブラリならRから呼べる • Linuxの特定の環境下でしか動かなかった →もう少しいろんな環境で動く⾔語に移植しよう • 昔々、こんな記事を書いたことも
はじめてのGo⾔語 • インストール • 公式Webページから • Go⾔語のざっくり実⾏⼿順 • .goファイルにプログラムを書く •
go build コマンドでバイナリを作成 • バイナリを直接コンソールに⼊⼒
Hello Worldしてみる • hellowrold.go デモ mainパッケージであることの宣⾔ (Go特有の書き⽅なのでここでは気にしなくて良い) パッケージの読み込み 関数の定義
これをRから呼びたい • RからGoを呼ぶ⽅法 1. Goのコードを書く 2. Goの関数を呼び出すコードをC⾔語で書く 3. そのCの関数をRで呼び出す •
Rustはextendrという便利なものがあるので楽そう︖ですが、Goは 今の所愚直にやるしかなさそうです。 • C++を避けるのがスタートだったのになぜか結局Cを書いているというツッコミはなしで。 • Goの関数を呼ぶだけならぶっちゃけそんなに難しくないし…
やってみよう • 数値で試してみる(./calc/main.go) Cパッケージをインポート (Cから呼び出すのに必要) 数値に2を×関数 フィボナッチ数列を計算する関数 (ただしこの書き⽅だと遅い) コメントアウトで //export
関数名 を書く ファイル名がmain.goなら、お約束的に書く
この時点でのファイル構成 ・ calc main.go
ビルドして、共有オブジェクトを作る C⾔語で扱う「共有オブジェクト」と呼ばれるファイル。 UNIX系OS(macOSやLinux)ではso、 Windowsではdll拡張⼦を使う
この時点でのファイル構成 ・ calc main.go libcalc.h libcalc.so
C⾔語で、Go⾔語の関数を呼ぶ関数を書く • 数値で試してみる(./rgo.c) Rから呼ぶのに必要な ヘッダーファイルの読み込み 外部から呼び出す関数を宣⾔ 関数の定義 関数⾃体はGoで書いているので、 Rから⼊ってくる⼊⼒とRへの出⼒だけ 整合性が取れるように書けばOK
この時点でのファイル構成 ・ calc main.go libcalc.h libcalc.so rgo.c
Cプログラムをコンパイルする このとき、 UNIX系OSではgccが、 WindowsではRtoolsが必要
この時点でのファイル構成 ・ calc main.go libcalc.h libcalc.so rgo.c rgo.o rgo.so Rから呼ぶのに必要なのはこれ
いよいよRから実⾏︕︕︕
まとめ • RからGoの関数を呼ぶことができた • 結局Cを書いてコンパイルしたけど気にしない • 逆に⾔えば、C系の⾔語に慣れている⼈ならすぐにやれそう • ただしGo⾔語の壁… •
Rcppから呼べると楽しそう(Go製のプログラムをRcppで呼ぶ前例はある) • Goの強みを活かすような解析(並列実⾏とか︖)や、プロダクショ ンレベルでRを使いたいといったニーズに応えられる…かも • これからいろいろ開発がんばります • フィードバックお待ちしています︕
⼩話1 • RとGo⾔語の関係 • 普通にRを使っているとGoを意識することは基本ないけど、裏側で は実は結構使われていたりする 例: • RStudioサーバーのバックエンドはGo実装 •
Dockerはそれ⾃体Go製のプログラム
⼩話2 • 実はR×Goの話は、プロジェクトとして進みそうな雰囲気があった 時期もある • RStudio社のRomain Francois • dplyrなどtidyverse系の多くの パッケージのコミッター
• ただし、2018年以降は特に進展が ないっぽい https://speakerdeck.com/romainfrancois/arrow-plus-ergo-1?slide=8