R(4)メタプログラミング

Expression について

Computation
R
Author

司馬 博文

Published

5/07/2021

Modified

6/05/2024

概要
R は統計計算のための言語です.

1 Expression とは

1.1 Language Object

オブジェクト志向言語ではコード自体もオブジェクトであり,R では call, expression, name の3つのモードから構成される.1

1つのクラスからなるわけではなく,call, symbol, constant, pairlist の4つの型からなる.2

1.1.1 pairlist

R の内部で用いられるデータ型であり,Lisp の dotted-pair listに似ている.

pairlistオブジェクトは3つの slot をもち,CAR, CDR, TAGと呼ばれる. * CARCDRは IBM の 60 年代のコンピュータのaddress,decrementレジスタに由来し,リストの head と tail を指す. * TAGは文字列オブジェクトである.

pairlistの R 内での機能はlistと全く同じで,indexing syntax [[]]も同一である.

1.2 コンストラクタ

次のような操作ができる3

rlang::expr がコンストラクタである:

z <- rlang::expr(y <- x*10)
z
y <- x * 10
str(z)
 language y <- x * 10
typeof class mode
language <- call

1.3 評価

expression オブジェクトは base::eval() で評価できる:

x <- 4
eval(z)
y
[1] 40

1.4 参照方法

expression には list のようにアクセス可能である:4

library(rlang)
f <- expr(f(x = 1, y = 2))

f$z <- 3
f
f(x = 1, y = 2, z = 3)
f[[2]] <- NULL
f
f(y = 2, z = 3)

2 メタプログラミング

2.1 enexpr 関数

capture_it <- function(x) {
  expr(x)
}
capture_it(a + b + c)
x
capture_it <- function(x) {
  enexpr(x)
}
capture_it(a + b + c)
a + b + c

References

Wickham, H. (2019). Advanced r. Chapman & Hall.

Footnotes

  1. R Language Definition↩︎

  2. (Wickham, 2019) 第17章2節.↩︎

  3. (Wickham, 2019) 第18章↩︎

  4. (Wickham, 2019) 第17章2節.↩︎