【identical】Rで関数の比較

久しぶりに R を書いてるときに, 2つの関数が等しいか比較したくなる場面に出くわしたので少し調べてみました。

identical

結論としては identical で関数を含めた Rのオブジェクトの比較ができた。以下のように論理値が返る。

> identical(max, max)
[1] TRUE
> identical(max, min)
[1] FALSE

調べるきっかけとなったのは lapply で list の要素に適用する関数に渡す関数によって処理を変えたい場面に出くわしたから。
(R の関数は first-class function なので関数の引数に関数を指定できる)

簡単な例にしてみると以下の感じ。

> f <- function(d, func) {
+   if (identical(func, sum)) {
+     func(d)
+   } else {
+     "func is not sum"
+   }
+ }
>
> l <- list(c(1,2,3), c(4,5,6), c(7,8,9))
>
> lapply(l, f, sum)
[[1]]
[1] 6

[[2]]
[1] 15

[[3]]
[1] 24

> lapply(l, f, max)
[[1]]
[1] "func is not sum"

[[2]]
[1] "func is not sum"

[[3]]
[1] "func is not sum"

R言語徹底解説 (Advanced R) の 第6章 関数 に引用として以下のように書かれている。

  • すべてはオブジェクトとして存在する.
  • R内で起きることすべては関数呼び出しである.

`R内で起きることすべては関数呼び出しである.` ので, 演算子も関数呼び出し。

> x <- 1
> y <- 2
> x + y
[1] 3
> `+`(x, y)
[1] 3

また, `すべてはオブジェクトとして存在する.` ので identical で演算子(オブジェクト)の比較ができる。

> identical(`+`, `+`)
[1] TRUE
> identical(`+`, `-`)
[1] FALSE


[1] r – How to compare functions?