問題発見と解決で死亡フラグが立っているのは、俺のRの経験が少ないところによるものが大きい気もする。簡単な解析、一週間程度の解析とかならいいけど、中期間以上に渡るものはもうちょっと考えてやらないと。
引数が多いときにはリストにする
Perlとかだとハッシュを渡す、って感じのやつ。クックブック(?)に載ってたやつだけど*1。関数がやってることは意味ないことだけど、こんな感じで引数渡せるようにしておくと、あとで思いだしやすい。あと、ディフォルト引数もたまにしかやらないやつは与えとくと便利だよね。
my.function <- function(arima=list(p,d,q),sarima=list(P,D,Q),period=7){ p <- arima$p d <- arima$d q <- arima$q P <- sarima$P D <- sarima$D Q <- sarima$Q cat(p,d,q,P,D,Q,period) } my.function(arima=list(p=3,d=1,q=3),sarima=list(P=2,D=1,Q=3))
プロットした時もinvislbleとかで値を返しておく
ある程度重い処理をした後にグラフをプロット、その後に中の結果が知りたくなったから、中のをもう一回計算…というのは重いやつをしたときほどだるい。そんな時にはinvisileを使おう。
こんな感じでやると普通にプロットもできるし、計算の結果もあとで使えるよ。またも、計算自体にはあんまり意味ない例ですが。。
my.function2 <- function(vec){ plot(vec^2) return(invisible(vec^2)) } val <- my.function2(1:100) val
「本当にこんなの使うのかよ?」って思う人はお馴染のhist関数でやってみるといい。実はいろいろ情報を返してくれていることが分かる。
> rand <- hist(rnorm(100)) > rand $breaks [1] -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 $counts [1] 1 4 10 15 24 19 9 7 6 4 1 $intensities [1] 0.02000000 0.08000000 0.20000000 0.30000000 0.48000000 0.38000000 [7] 0.18000000 0.14000000 0.12000000 0.08000000 0.02000000 $density [1] 0.02000000 0.08000000 0.20000000 0.30000000 0.48000000 0.38000000 [7] 0.18000000 0.14000000 0.12000000 0.08000000 0.02000000 $mids [1] -2.25 -1.75 -1.25 -0.75 -0.25 0.25 0.75 1.25 1.75 2.25 2.75 $xname [1] "rnorm(100)" $equidist [1] TRUE attr(,"class") [1] "histogram"
printで出力してもいいけど、こういう風に返しておくと、あとあと使いまわせて便利なんですよね。
また後で追記するけど、こういうのある人は書いてくれるとうれしいですねー。
*1:ベストプラックティスだったかなぁ?