スキップしてメイン コンテンツに移動

投稿

6月, 2008の投稿を表示しています

Rのバッチモードでコマンド引数を取る関数を書いたが必要なかった

[[バッチモードのRにおけるコマンド引数の参照|http://d.hatena.ne.jp/dancing_infobio/20071105/p1|http://d.hatena.ne.jp/dancing_infobio/20071105/p1]]で初めて知ったのだけど、Rのバッチモードで --argsを指定すると、commandArgs() でコマンド引数をとれるらしい。
<<<
$ R --vanilla --quiet -e 'print(commandArgs())' --args hoge fuga piyo
> print(commandArgs())
[1] "/Library/Frameworks/R.framework/Resources/bin/exec/i386/R"
[2] "--vanilla"
[3] "--quiet"
[4] "-e"
[5] "print(commandArgs())"
[6] "--args"
[7] "hoge"
[8] "fuga"
[9] "piyo"
>>>
たしかにとれる。しかし、引用元のエントリでも指摘している通り、"--args" 以降でなくて、全部の引数が格納されるので使いづらい><
気分によって --quiet を指定しなかったり、-e じゃなくて スクリプトをリダイレクトしたい場合に "--args" の位置が変わっちゃうじゃん。怖くて使えないよ。

そこで --args 以降を取得する get_args() を作ってみたが必要なかったorz...
R --vanilla --quiet -e 'print(commandArgs(trailingOnly=T))' --args hoge fuga piyo
で良いそうです。THX > ma_ko
http://twitter.com/ma_ko/statuses/842339104

仮に、--args がない場合は character(0) が帰ってくるので自分で例外処理し…

勝手に添削、R言語でモンテカルロ法

追記: 0093さんにツッコミを頂いた。マトリックスでなくてベクターで乱数を用意しておけばもっと高速。確かにその通りですね。ありがとうございました。(今思えば、実務ばっかりやっていて、データはマトリックスに入っているもの、という先入観があって、無意識にわざわざマトリックスにしてしまったorz...)

[[R言語でモンテカルロ法|http://d.hatena.ne.jp/necoffee/20071119/1195478473]]になぜか[[今になってツッコむ id:syou6162さんとid:kkobayashiさんは自重しろw|http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/necoffee/20071119/1195478473]]

まあわたくしめも、それベクトルで書くとRらしくなるよ! と書こうと思ったら、[[id:kkobayashi|http://b.hatena.ne.jp/kkobayashi/20080623#bookmark-8998139]]さんに先を越されていたorz...

さて、気を取りなおして... 別な方向から添削してみる。ベクトル計算すれば速くなるという噂を聞いたことがあると思うけど、実はオリジナルのソースよりも [[id:kkobayashi|http://b.hatena.ne.jp/kkobayashi/20080623#bookmark-8998139]]さん の例はちょっと遅くなる。格納するマトリックスを先に用意しておくと2桁オーダー速くなるよ。

<<<
# id:necoffee を改変
montecarlo <- function(n) {
count <- 0
for(i in 1:n) {
s <- runif(2)
if( s[1]^2 + s[2]^2 < 1 ) {
count <- count + 1
}
}
return(4*count/n)
}

# id:kkobayashi version, ランライナーでかっこいい
montecarlo_vec <- function(n) {
sum(replicate(n, sum(runif(2)^2)) < 1)*4/n
}

# ソースは俺w マトリックスで乱数を用意しておく。微妙な…

なぜ速くなったのか?

Rprof()を使って調べてみる。結論から言うとマトリックスをつくるところで遅いわけではないようだ。
<<<
my.prof <- function(x) {
Rprof()
x
Rprof(NULL)
print( summaryRprof() )
}

my.prof( montecarlo(100000) )
my.prof( montecarlo_vec(100000) )
my.prof( montecarlo_vec2(100000) )
my.prof( montecarlo_vec3(100000) )
>>>
まずは for() バージョン
<<<
by.self
self.time self.pct total.time total.pct
"runif" 0.80 57.1 0.80 57.1
"montecarlo" 0.54 38.6 1.40 100.0
"+" 0.04 2.9 0.04 2.9
"<" 0.02 1.4 0.02 1.4
"my.prof" 0.00 0.0 1.40 100.0
>>>
四則演算やrunifが for() で繰り返されているのでそのぶん遅くなっている。

次は replicate バージョン
<<<
$by.self
self.time self.pct total.time total.pct
"runif" 0.90 60.0 0.90 60.0
"FUN" 0.26 17.3 1.26 84.0
"lapply" 0.22 14.7 1.48 98.7
"^&quo…

Rでオブジェクト指向プログラミング超入門

[[R&iPod touchの単語帳を強化したよ!!|http://d.hatena.ne.jp/syou6162/20080614/1213262597]]の中のひとが、グローバル変数でお困りのよう。クラスを作って、インスタンス変数にアクセスすれば良い? 元のソースをちゃんと読んでいないので、空気が読めてなかったら、すまん。

例: 総称関数 getAgeが idolクラスの age にアクセスしている。getAgeはidolクラスのメソッドになっている。
<<<
# まずはクラスを作る
setClass("idol",
representation(
fullname = "character",
age = "numeric",
height = "numeric",
weight = "numeric"
),
prototype(
fullname = "Iori Minase",
age = 14,
height = 150,
weight = 39
)
)

# idolクラスに属する総称関数を作る
setGeneric("getAge", function(this) standardGeneric("getAge"))
setMethod("getAge", "idol", function(this) { this@age })

# idolクラスを使ってみるよ。まずharukaというインスタンスを作る
haruka <- new("idol", fullname="Haruka Amami", age=16, height=158, weight=45)
print( getAge(haruka) ) # 総称関数getAgeからインスタンス変数にアクセスする
>>>
これをidol.rとして保存し、実行するよ。
<<<
source("idol.r")
[1] 16
>>>

こっちも参考にするといいよ。[[Rでオブジェクト指向…

勉強した分だけマスを埋めていくと勉強が続くらしいので、マスを自動生成するプログラムを書いてみたよ

[[大学のときTOEIC390点だった社会人が1年でTOEIC「Bクラス」を出す方法|http://anond.hatelabo.jp/20080609005131]]

""勉強時間はノートに書いて30分単位で記録、グラフ化。その上で、月ごとに目標勉強時間を決めておいて、その時間分だけマス目を作成。実際に勉強した分だけ塗りつぶしていきました。この記録は「モチベーションの維持」のためにつけていました。より「自分が勉強している」ことをより実感出来るよう、手書きのノートにこだわりました。実際、マス目が少しずつ埋まっていくのは結構快感です。また、ノートなら簡単に見返すことが出来るのもいいところです。ハッキリいって、この習慣がなかったら、おそらく勉強が続くことはなかったと思います。

勉強のログを取りましょう、という話は良く聞くよね。記録を付けるとダイエットが続くとかいうアレとかね。また、手でマスを埋めていく快感を得ること、つまり、達成感を得る儀式の導入が大事というのは、[[バブルマップ|http://www.ideaxidea.com/archives/2005/10/_todo.html]]のなかの人も言ってたよね。

これまでブログやはてなグラフ、Google Spreadsheetsとか使ってログを書いてたけど、手で消す快感とやらを体感したくなったのでマスを作ることにした。

マスの例。実際はA4のPDFに出力される。

http://img.skitch.com/20080609-t7iuhyy1ia9incshkyntdpieec.jpg

マスを埋めたところ。328ページあるテキストを読んでいる途中。

http://img.skitch.com/20080609-e3kb75nypb4i3kg6esp6de56ja.jpg

コードはこちら。pagesには本のページ数やトータルの勉強時間とか入れたらいいよ。出力されるPDFのファイル名はfilenameのところね。

<<<
# init
filename <- "hoge.pdf"
pages <- 328

# make a grid
rows <- pages%/%10 + 1
x <- 1:10
y <- 1:rows
z <- rep(c(rep(c(0,1…