R言語のifelseを条件演算子的に使うときは注意
偉そうにR言語の入門記事を投稿したその日にやってしまったミスを紹介。
R言語でifelse()という関数があります。
ifelse(条件,真の時,偽の時) のような書き方をすることで条件に沿った方が戻り値として得られるというもので、ほかの言語でいう条件演算子のような使い方をしていました。
条件演算子: 条件 ? 真の時 : 偽の時 というやつ
こういう書き方をした時に思わぬ動きをしました。
model <- ifelse(条件, modelA, modelB)
やりたかったこととしては条件によりどちらのモデルを採用するかを決めるというもの。
modelA/Bの中身はlist構造でいろいろなものが詰め込まれています。
この書き方で条件がTrueの時、得られたのはmodelAの一部分になってしまいました。
これはmodelAのlistの一つ目(いわばmodelA1)だけが返ってきていたためでした。
なんだこの仕様はと思ったものの、よく考えればR言語は基本的にベクトルを扱うわけで、ifelseもこういった入力を想定しているわけです。
NewVec <- ifelse(c(T,F,F,F,T), c(1,1,1,1,1), c(2,2,2,2,2))
NewVecはc(1,2,2,2,1)となる
そう考えると、条件部分に一つしか真偽値が入ってなければ、一つだけしか返さないよというのも変な仕様とは言えないなと。
ifelse( 1==1, list(a=3, b=5), list(c=6, d=9,e=10))
↑で帰ってくるのは"3"のみ。
注意。注意。