チラシの裏の設計書

プログラム開発、データ分析からロボット作りまでものづくり全般を思うがままに書き連ねたブログ。

R言語のifelseを条件演算子的に使うときは注意

偉そうにR言語の入門記事を投稿したその日にやってしまったミスを紹介。

qiita.com

 

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"のみ。

 

注意。注意。