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

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言語スキルもちょっとは上がってきてるのかもね