初めての
Rメタプログラミング
![]()
いくつかのプログラミング言語を使ってきたけど
いくつかのプログラミング言語を使ってきたけど

Tokyo.R#76 BeginneRSession-data pipeline by @kilometer00

Tokyo.R#76 BeginneRSession-data pipeline by @kilometer00

何がすごいか
渡したコードの意味が変わっている
.)例えばJavaScript
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Pipeline_operator



JavaScriptでパイプ演算子を使うには
言語の進化を待たなければならない
Rだと
%>%はmagrittr packageで定義された単なる演算子
自分で作ることもできる

宇宙のできる前のR(1.0.0)に異世界転生しても
パイプ演算子を実装できる

宇宙が生まれる前の話 by @0_u0
このセッションの目標
R言語について知る
そしてメタプログラミングを使って
※以降の内容は基本的にパイプ演算子自作入門を加筆修正したものになります。
中置演算子
関数呼び出し
実は
これは
これは
なのでこれは
演算子を定義する
ここまでの知識で
これは
こう実装できる
動いた
でも右辺が関数呼び出しだとだめ
もう少し知識が必要
Rの関数では
つまり
引数が使われた場合に初めて評価される

Rの関数は、引数の値だけでなく
この引数を計算するコードを利用する評価方法が
NSE (Non-standard evaluation)
substitute() で表現式を捕捉できる
quote() でも表現式を捕捉できる
ただし関数内での挙動が違う
eval() で表現式を評価できる
eval() の第2引数で環境を指定できる
quote() は表現式を返す
表現式は
abstract syntax tree (AST) とも呼ばれる
pryr::ast() で木構造を見ることができる
うぉ、 pic.twitter.com/kvC7vXpkbw
— kilometer (@kilometer00) April 20, 2019
Lisp、お前だったのか。
— kilometer (@kilometer00) April 20, 2019
表現式はlistのように扱える
表現式は修正できる
ということは
構文木を読み書きする
もういちどパイプ演算子を実装してみよう
x %>% f(y) が f(x, y) と等価
f の引数の先頭に x を追加すれば良い
バージョン2
動いた
でもプレースホルダー (.) に対応していない
もう少しがんばる
表現式がドットを含むかどうか確認する補助関数
引数の先頭にドットを追加する補助関数
バージョン3
右辺にドットがあってもなくても動く
追加情報
あーほんとだ
— igjit (@igjit) May 14, 2019
右辺が関数名だと動かないですね😇
ありがとうございます!
書いた。Thanks @Atsushi776
— igjit (@igjit) May 16, 2019
パイプ演算子自作入門のその後https://t.co/zU6G6ZTdU0
ちなみに本物のパイプ演算子を使いたい場合は
magrittrのソースコード読むと楽しいよ。

追加情報
原著 (Advanced R) の2nd editionでは
rlangを使ったよりモダンなメタプログラミングを説明している。
構文木を読み書きできる
偉大なる力
使用例
抽象構文木を操作してこその人生なのです
— igjit (@igjit) 2018年2月27日
Rはすごく不思議な言語
Rはすごく強力な言語
Rはすごく楽しい言語