Rで画像の自動生成

課題は今日提出だったから、もう出してもいいでしょ。マーケティング工学でadbudg関数のパラメータをいじって遊べ、っていう問題がありました。僕はパラメータのcと広告の割合Xのrangeの二つをいじったので、グラフで比較するためには「cのいじった分」×「xのいじった分」の通りのグラフを作成しないといけません。まあ、そんなに多くないからいいといえばいいんだけど、「パラメータが何で…」とか自分で書くのもアホらしいかったのでプログラム書きました。第一手作業でとか、俺がやることじゃないし。

何とか関数っていうのは以下で定義。

adbudg<-function(x,a=2.3,b=0.5,c=5.28,d=2.6){
    return(b+(a-b)*x^c/(x^c+d))
}

で、こんな感じでループを回す。

for(x in c(10,100,200)){
    for(c in c(5,0.9,0.5,0.1)){
        png(paste(deparse(substitute(x)),"=",x,",",deparse(substitute(c)),"=",c,".png",sep=""))
        curve(adbudg(x,c=c),0,x,main="ADBUDG反応関数",sub=paste("パラメータはa=2.3,b=0.5,",
        deparse(substitute(c)),"=",c,",d=2.6",sep=""),xlab=paste(deparse(substitute(x))),ylab="反応関数")
        dev.off()
    }
}

そうするとパラメータとかがきちんと表示された「x=10,c=0.5.png」みたいなファイルが、この場合12個くらいできあがる。いろんなパターンはこの辺見てくれい。

大量生成した後のフォルダ。setwd()とかでディレクトリ移っておくのが吉。

解説

わっしょいわっしょい。ポイントは「paste(deparse(substitute(x))」とか「curve」くらいっすかね。あとは自分で調べてくれい。別にR勉強会でやってもいいけど。

paste関数

Rで文字列を連結させるための関数です。引数に複数個のオブジェクトを取ることができて、sepで間の文字を指定します。以下は例。

> a<-"yasuhisa"
> b<-"yoshida"
> paste(a,b)
[1] "yasuhisa yoshida"
> paste(a,b,sep=",")
[1] "yasuhisa,yoshida"
> paste(a,b,sep="☆")
[1] "yasuhisa☆yoshida"

deparse関数とsubstitute関数

こいつらはセットとかでよく使われているっぽい。substitute関数は引数に使われている変数の中身、ではなくて変数の名前自身とかを返してくれます。例えばこんな風。

> x<-"yasuhisa"
> substitute(x)
x

で、普通はdeparse関数をかぶせて使ってあげる。

> deparse(substitute(x))
[1] "x"

何でこんなことする必要があるかっていうと返ってくる型が違うから。name型っていうのはよく知らないけど、僕等が欲しいのは大抵characterなので、deparseしときましょうというわけだ。

> mode(substitute(x))
[1] "name"
> mode(deparse(substitute(x)))
[1] "character"

curve関数

deparseとかは結構載ってないような気がするんだけど、curveとかはありふれて使われます。curve関数に、表示したい関数と表示したい範囲を明示してやれば、その関数をプロットすることができます。やったね!!だから、こんなのも一行で書けちまうわけだ。R万歳!!

正規分布。

X^2分布。

この場合のように自分で定義した関数ももちろん使うことができます。わーい。実はこの辺から放っぽり出していた問題であることとかは内緒w。