R

digestとfilehashで適当に永続化

R

概要 d:id:hotoku:20120328 で、S4オブジェクトの中にキャッシュを持つ方法を考えたが、先のコードのままでは、オブジェクト自身以外の引数がある場合には上手くいかない。また、当たり前だけど、メモリにキャッシュがあるのでRを終了したらキャッシュも消え…

S4クラス用のgeneric関数でキャッシュを実現する方法を考える

概要 Rが常に値渡しであるために関数の返り値のキャッシュをオブジェクトの中に素直に持てなくて困ったので解決法を考えた。 背景 ある特定のオブジェクトを引数として、もの凄く重たい関数が何回も呼ばれるとする。毎回真面目に計算するのはしんどいので、…

S4クラスを継承する時に気を付けること

背景 S4クラスメカニズムでは、setMethod関数のcontains引数に親クラスの名前を含める事で継承を実現できる。で、こんなコードを書くとエラーになってしまった。 setClass("A", representation(a="numeric")) setMethod("initialize", "A", function(.Object…

2つのベクトルの両方に含まれる要素(メモ)

appear <- function(x, vec){ sapply(x, function(a){ any(vec==a) }) } two <- 2 * 1:10 thr <- 3 * 1:10 two[appear(two, thr)]

S4クラスとSICP

R

Rにはオブジェクト指向プログラムのためのフレームワークとしてS4というものがあるらしい。と、いうことは長らく知っていたけど、説明を読んでもさっぱり分からなかったので、全く使ったことが無かった。ところが、SICPを読んでみたら何となく分かったので、…

RUnitの使い方メモ

R

単体テストというものの有難味が分かり始めた。Rでの単体テストフレームワークであるRUnitの使い方をメモる。 テスト駆動開発なので、まずはテストを書く。 test.func1 <- function(){ checkEquals(func1(), 1, "func1 : NG") } test.func2 <- function(){ c…

値代入のコスト

R

結果は同じだけど、実行時間は大分違う。 x <- matrix(0, nrow=100, ncol=100) system.time(for(j in 1:10000)for(i in 1:100)x[0,i] <- 1) ## user system elapsed ## 2.203 0.037 2.321 system.time(for(j in 1:10000)x[0,] <- 1) ## user system elapsed …

これはRのバグなのか?

R

Rのリストでは、要素に名前が付いているとき、list$nameでその要素にアクセス出来る。それを使っていて、たまたま変な挙動を見つけたので、メモ。 > l <- list(x=1, xxx=2, y=3, yyy=4) > l$x [1] 1 > l$xx [1] 2 > l$y [1] 3 > l$yy [1] 4 > l[["xx"]] NULL…

Rのメモ

メモ1 2本のベクトルx, yがある時に、x, y両方に含まれている要素を調べる方法。 > x <- 2 * (1:10) > y <- 3 * (1:10) > x[apply(outer(x, y, '=='), 1, any)] [1] 6 12 18 メモ2 Rの付置演算子をemacsのalignで揃える。 ;; align for R (require 'align) (…

副作用とapply系関数

細かいことは知らないけど、Rでは、とにかくforは使うべからず、apply系関数を使え、と叩きこまれている(誰に?)。分かった、分かったけど、じゃぁこんな時どうすんのよ?と、ずっと悩んでた。 temp for (i in 1:10) { x[i] z[i] temp } http://www.mathfinanc…

Rで関数型プログラミング

背景 1年前の自分が、こんなデータを作っていた。 データ全体は、recordのリスト recordは、そのrecordが作成された時刻とdataを納めたリスト dataは、entryのリスト entryは、TYPE_A, TYPE_B, TYPE_Cの3つの数値ベクトルを納めたリスト。但し、長さ0かもし…

Rのスコープ規則でハマったので調べた、というお話

motivation ある関数の中で、データフレームをいじくり回したかった。が、いちいち [ 演算子とか $ 演算子とかでアクセスすると、コードが見辛くなってやだ、と思った。例えば、 plot(dat$x[dat$label=="a"], dat$y[dat$label=="a"]) みたいなコードは書きた…

Rでsemiparametric regression

選択出来るパッケージ SemiPar mgcv gam gam, SemiPar, mgcvの順で昔からある。

rでfold

Reduceという関数がある。 > Reduce(paste, letters) [1] "a b c d e f g h i j k l m n o p q r s t u v w x y z" '...'引数は無いので、使いたければ無名関数を経由する。 > Reduce(function(x, y)paste(x, y, sep="/"), letters) [1] "a/b/c/d/e/f/g/h/i/…

Rのtips

abind デフォルトのRには、rbind, cbindはあるけど、2次元以上の配列をくっつける関数は用意されていない。が、abindライブラリのabindで出来る。 library(abind) x <- matrix(1:9, nrow=3) y <- matrix(11:19, nrow=3) abind(x, y, along=3) , , 1 [,1] [,2…

RでplotしようとしたらX11が使えないと怒られたぞ。

> plot(1:10) Error in function (display = "", width, height, pointsize, gamma, bg, : X11 module cannot be loaded In addition: Warning message: In function (display = "", width, height, pointsize, gamma, bg, : unable to load shared object '…