R 備忘録 2013/05/08
言語の仕様なんてあんまり書きたくないのですが(細かいし、つまらないし、そのうち変わったり消え去ったりするし)どっかに書いとかないと忘れるのでしょうがない。
データ構造
僕の理解です。間違ってたらごめんなさい。
ベクトル := 1次元配列行列 := 2次元配列多次元配列 :いわゆる多次元配列だが、全ての要素の型が同一でなければならないリスト :要素の型をバラバラにできる1次元配列データフレーム:行/列ごとにラベルを持ち、列ごとに異なる型を使える2次元配列
別記事にまとめます。
非スカラの等価性判定(ベクトルの等価性)
== で書くと
> c(1, 2, 3) == c(1, 2, 3)
[1] TRUE TRUE TRUE
こうなってしまうので、こう書きます。
> all(c(1, 2, 3) == c(1, 2, 3))
[1] TRUE
なにか他にないのでしょうか。
if 文の条件式に論理型ベクトル
こうなりました。
> f <- function(x) if (x) return (1) else return (0)
> f(c(TRUE, TRUE, FALSE))
[1] 1
Warning message:
In if (x) return(1) else return(0) :
the condition has length > 1 and only the first element will be used
ベクトルの個々の要素に自作関数を作用させる
シンプルな関数については何も考える必要がありません。
> g <- function(x) return (x+1)
> g(1:5)
[1] 2 3 4 5 6
しかし、例えば上の f を論理型ベクトルの個々の要素に作用させたい場合は困ってしまいます。
そういうときは、例えば sapply などを使います。
> sapply(c(TRUE, TRUE, FALSE), f)
[1] 1 1 0
多変数関数の場合は mapply を使います。
> h <- function(x, y) if (x && y) return (1) else return (0)
> h(c(TRUE, TRUE, FALSE, FALSE), c(TRUE, FALSE, TRUE, FALSE))
[1] 1
> mapply(h, c(TRUE, TRUE, FALSE, FALSE), c(TRUE, FALSE, TRUE, FALSE))
[1] 1 0 0 0
関数の再帰
フィボナッチ数列を再帰で作ってみましょう。
> fib <- function(n) if (n == 0 || n == 1) return (n) else return (fib(n-1) + fib(n-2))
> mapply(fib, 0:10)
[1] 0 1 1 2 3 5 8 13 21 34 55
そうしたら関数の名前を変えてみましょう。
> hoge <- fib
> mapply(hoge, 0:10)
[1] 0 1 1 2 3 5 8 13 21 34 55
更に、fib に別の関数を代入してみましょう。
> fib <- function(n) return (1)
> mapply(hoge, 0:10)
[1] 0 1 2 2 2 2 2 2 2 2 2
名前に引きずられて関数の中身が変わってしまいました。
名前に依存せずに再帰するには Recall を使います(無名再帰)。
> fib2 <- function(n) if (n == 0 || n == 1) return (n) else return (Recall(n-1) + Recall(n-2))
> mapply(fib2, 0:10)
[1] 0 1 1 2 3 5 8 13 21 34 55
> hoge <- fib2
> fib2 <- function(n) return (1)
> mapply(hoge, 0:10)
[1] 0 1 1 2 3 5 8 13 21 34 55
高階関数
普通に使えます。
> f <- function(x) return (x+1)
> g <- function(x) return (2*x)
> join <- function(s, t) return (function(x) s(t(x)))
> h <- join(g, f)
> h(10)
[1] 22
> g(f(10))
[1] 22