53歳限界プログラマの憂鬱

SU/CAR-ST-APplication-cellsから派生したプログラマのブログ

本家はこちら↓
f:id:sucar:20151115183011p:plain

SU/CAR-ST-APplication-cellsの安倍野ミックスと申します
来訪ありがとうございます
シストレツールを自作してます

f:id:sucar:20150414193802p:plain

if ~ else ~と ifelse の違い

ifelse(x>0,1,0)

 と

if (x>0) {
 1
} else { 
 0
}

の根本的な違いは?

x<-0として実行してみると

> x<-0
> ifelse(x>0,1,0)
[1] 0
> if (x>0) {
+ 1
+ } else {
+ 0
+ }
[1] 0

同じ結果が返ってくるが

x<-0:9 とベクトルで試してみると違いが出てくる

> x<-0:9
> ifelse(x>0,1,0)
[1] 0 1 1 1 1 1 1 1 1 1
> if (x>0) {
+ 1
+ } else {
+ 0
+ }
[1] 0
Warning message:
In if (x > 0) { :
the condition has length > 1 and only the first element will be used

ifelseはちゃんとベクトルで返ってくるけど、if ~ else ~はベクトルの最初だけ実行してあとは実行しないで警告が発生する

うまく説明できないけど

ifelseはオブジェクトというか関数というかそういうもんで

if ~ else ~は制御文

プロンプトから

>ifelse

って打てば、ifelse関数の中身のソースが表示されるけど

>if

って打つと

となって「完結してないので続きを」となる

うまく説明できないけど、、、

例えば、エクセルでセルに=if(A1>0,1,0)とかif関数を入力できるけど、これをセルにずーっとコピーして、=if(A2>0,1,0) =if(A3>0,1,0) ・・・ってやつがベクトル化ってこと

ifelseにベクトルを渡すのはこのようにエクセルでセルにコピーしてると考えるとわかりやすいかも(イメージ的に)

if ~ else ~ の方は、エクセルのセルに入れられないからベクトルを渡すことができない

まったくうまく説明できないけど、、、

この辺の感覚が理屈抜きで身につけば、R言語スキルもちょっとは上がってきてるのかもね