simbee.core.R
という中核部の関数だけ集めたソースファイルを
いきなり書いてみることに
(テキストエディター vim
で書いてる
--- 昨日のぎょーむ日誌画像の「うしろ」のほうで
ぎょーむ日誌を編集してるあれ):
sim.bee
という関数が必要だろう,
sim.bee <- function() # ??? { # ??? }と関数の「カラ」だけ書いてみる
sim.bee()
に何もかもつめこむことは避けたい
……
分離できそうな処理は何だろうか?
花の初期状態の設定はめんどうなんで
init.flowers <- function() ...
という初期化の作業に特化した関数のカラも書き足してみる
init.flowers
の内容を書いてみる
init.flowers
にあれこれ教えてやるデータ構造の定義が必要になるので,
ファイル中に実例を書いたり,
コメントをいろいろつけたり
help()
で調べたり,
動作に確信がもてない部分を検証していく
---
たとえば
「指定した場所のみ値が入っててその他は 0
とかでうまっている vector」
を生成する既成ものの関数はなさそうなんで,
こんなのでいいのかしらん,
fill.vector <- function(x, x.part, filler = 0) { sapply( x, function(i) { y <- x.part[as.character(i)] if (is.na(y)) return(filler) else return(y) } ) }とためし書きして R で動かしてみると,
> fill.vector(1:6, c("1" = 10, "3" = 12, "5" = 8)) 1 3 5 10 0 12 0 8 0なる出力えられるんで, なんとなくヘボっちい関数だけどまあ使うことにするか, とか
data.frame()
つかった),
こんどはこれを「食わせて」
動かす本体 sim.bee()
にとりくんでみる
sim.bee.onebout()
なる関数を新しく作って
(つまりまた処理の分離分割をして),
そちらで花序に入ってから出るまでの訪花シミュレイションと
その行動記録をとることに専念させる
vim
上で :%s/bout/inflorescence.visit/gc
とでも置換してしまえばよい)
sim.bee.onebout()
できた.
これ単体で動くし,
それが重要なのである.
なぜかといえば,
関数からかえってくる list()
> sim.bee.onebout(rep(100, 5), an.example.parameters) $carryover [1] 72 $visit [1] 3 4 $n.visit [1] 2 $pollen residual drop capture 1 100 0 0 2 100 0 0 3 29 0 71 4 32 67 68 5 100 0 0を子細に点検して花序内のハチの動きをおうと, 花粉収支のつじつまがあってることが確認できるからだ. なお
drop
は隣花受粉の量と同等ではなく,
その花に着地するかしないかぐらいまでに落とした量
……
うーむ,
あいまいな定義だな
sim.bee.onebout()
ができれば,
複数の bout を計算するだけの
sim.bee()
は簡単にできる.
動作試験.
> sim.bee(init.flowers(fset), 5, an.example.parameters) color pollen00 drop00 removal00 pollen01 drop01 removal01 pollen02 drop02 removal02 1 Yellow 100 0 0 32 0 68 32 0 0 2 Yellow 100 0 0 100 0 0 100 0 0 3 Yellow 100 0 0 100 0 0 100 0 0 4 Red 0 0 0 0 0 0 0 0 0 5 Red 0 0 0 0 0 0 0 0 0 6 Red 0 0 0 0 0 0 0 0 0 pollen03 drop03 removal03 pollen04 drop04 removal04 pollen05 drop05 removal05 1 32 0 0 13 0 19 3 0 10 2 28 0 72 28 0 0 7 10 21 3 100 0 0 100 0 0 100 0 0 4 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 21 0問題なさそうだ.