4.2 Rプログラミングの基礎(if, loop, 関数)

4.2.1 条件分岐(if)

if文

if文の例

#if statement
a <- 3 #aというオブジェクトに3を代入
if(a > 3) { #「a > 3」という条件式で条件分岐させる
  #「a > 3」という条件式が真のときに次のコードが実行される
  cat("a is greater than 3.", "\n") #this is executed when the condition is true
} else { #「a > 3」という条件式が偽のときに次のコードが実行される
  cat("a is less than or equal to 3.", "\n") #This is executed when the condition is not true
}
a is less than or equal to 3. 

[a > 3]という条件式の真(TRUE)/偽(FALSE)を判定する→aの値は3なので、当然偽(FALSE)である

a > 3
[1] FALSE

他の関係演算子の挙動を確認してみよう

a < 3    #aは3より小さい(=3未満)か?
[1] FALSE
a >= 3 #aは3以上か?
[1] TRUE
a <= 3 #aは3以下か?
[1] TRUE
a == 3 #aは3と等しいか?
[1] TRUE
a != 2 #aは2と等しくないか?
[1] TRUE
a == b #aはbと等しいか?
Error: object 'b' not found

if文の失敗例

#if statement
a <- 3 #aというオブジェクトに3を代入
if(a > 3) { #「a > 3」という条件式で条件分岐させる
  #「a > 3」という条件式が真のときに次のコードが実行される
  cat("a is greater than 3.", "\n") #this is executed when the condition is true
} 
else { #「a > 3」という条件式が偽のときに次のコードが実行される
Error: unexpected 'else' in "else"

else if文

a <- 2
if(a > 3) {  #条件式のチェック
  cat("a is greater than 3.", "\n") #「a > 3」という条件式が真のときにこのコードが実行される
} else if(a > 1) {
  cat("a is less than or equal to 3 but greater than 1.", "\n") #「a > 3」という条件式が満たされず、かつ「a > 1」が満たされるときにこのコードが実行される
} else{
  cat("a is less than or equal to 1.", "\n") #「a > 3」という条件式が満たされず、かつ「a > 1」も満たされないときにこのコードが実行される
}
a is less than or equal to 3 but greater than 1. 

4.2.2 繰り返し処理=ループ(for loop)

ループの例

n <- 10 #ループの回数を指定するオブジェクトnを用意して、10を代入
sum <- 0 #sumというオブジェクトの初期値を0に設定

#for loop 「ブロック」
for(j in 1:n) { #()の中でループの開始点(j = 1)と終了点(j = n)を指定
  sum <- sum + j #sumの値にjを足したものを上書きする
}
print(sum) #ループ終了後のsumの値を表示する
[1] 55

(ループを使わない場合)

sum <- 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
print(sum)
[1] 55

4.2.3 関数

関数定義の形式

関数名 <- function(パラメータ名 = デフォルトの引数値) {
  関数の中身
  return(戻り値)
}

関数の使用例

関数定義の例1

f_sum <- function(n = 10) {
  sum <- n*(n + 1)/2
  return(sum)
}

関数の呼び出し

f_sum(n = 5)
[1] 15
f_sum()
[1] 55

関数定義と呼び出しの例2

#任意のnからmまで足し算をする関数
f_sum2 <- function(n = 3, m) {
  sum <- 0 #初期値の設定
  #for loopを使って足し算の繰り返しを実現
  for(j in n:m) { #for loopの開始点はn, 終了点はm
    sum <- sum + j
  }
  return(sum)
}
#関数呼び出し&代入
test <- f_sum2(n = 100, m = 1000) #関数を呼び出して、戻り値をtestに代入
test
[1] 495550

関数定義・呼び出しにおける失敗ポイント

定義されていないパラメータに引数を渡す場合

f_sum(n = 100, m = 1000)
Error in f_sum(n = 100, m = 1000) : unused argument (m = 1000)

デフォルトの引数が指定されていない関数なのに引数を指定しなかった場合

f_sum2(n = 100)
Error in f_sum2(n = 100) : argument "m" is missing, with no default
LS0tDQp0aXRsZTogImNoYXB0ZXIwNF80LTIuUuOBq+WvvuW/nOOBl+OBn1IgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KIyMgNC4yIFLjg5fjg63jgrDjg6njg5/jg7PjgrDjga7ln7rnpI4oaWYsIGxvb3AsIOmWouaVsCkNCiMjIyA0LjIuMSDmnaHku7bliIblspAoaWYpDQoNCiMjIyMgaWbmlocNCmlm5paH44Gu5L6LDQpgYGB7cn0NCiNpZiBzdGF0ZW1lbnQNCmEgPC0gMyAjYeOBqOOBhOOBhuOCquODluOCuOOCp+OCr+ODiOOBqzPjgpLku6PlhaUNCmlmKGEgPiAzKSB744CAI+OAjGEgPiAz44CN44Go44GE44GG5p2h5Lu25byP44Gn5p2h5Lu25YiG5bKQ44GV44Gb44KLDQogICPjgIxhID4gM+OAjeOBqOOBhOOBhuadoeS7tuW8j+OBjOecn+OBruOBqOOBjeOBq+asoeOBruOCs+ODvOODieOBjOWun+ihjOOBleOCjOOCiw0KICBjYXQoImEgaXMgZ3JlYXRlciB0aGFuIDMuIiwgIlxuIikgI3RoaXMgaXMgZXhlY3V0ZWQgd2hlbiB0aGUgY29uZGl0aW9uIGlzIHRydWUNCn0gZWxzZSB744CAI+OAjGEgPiAz44CN44Go44GE44GG5p2h5Lu25byP44GM5YG944Gu44Go44GN44Gr5qyh44Gu44Kz44O844OJ44GM5a6f6KGM44GV44KM44KLDQogIGNhdCgiYSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMy4iLCAiXG4iKSAjVGhpcyBpcyBleGVjdXRlZCB3aGVuIHRoZSBjb25kaXRpb24gaXMgbm90IHRydWUNCn0NCmBgYA0KW2EgPiAzXeOBqOOBhOOBhuadoeS7tuW8j+OBruecnyhUUlVFKe+8j+WBvShGQUxTRSnjgpLliKTlrprjgZnjgovihpJh44Gu5YCk44GvM+OBquOBruOBp+OAgeW9k+eEtuWBvShGQUxTRSnjgafjgYLjgosNCmBgYHtyfQ0KYSA+IDMNCmBgYA0K5LuW44Gu6Zai5L+C5ryU566X5a2Q44Gu5oyZ5YuV44KS56K66KqN44GX44Gm44G/44KI44GGDQpgYGB7cn0NCmEgPCAzICAgICNh44GvM+OCiOOCiuWwj+OBleOBhCg9M+acqua6gCnjgYvvvJ8NCmEgPj0gM+OAgCNh44GvM+S7peS4iuOBi++8nw0KYSA8PSAz44CAI2Hjga8z5Lul5LiL44GL77yfDQphID09IDPjgIAjYeOBrzPjgajnrYnjgZfjgYTjgYvvvJ8NCmEgIT0gMuOAgCNh44GvMuOBqOetieOBl+OBj+OBquOBhOOBi++8nw0KYSA9PSBiICNh44GvYuOBqOetieOBl+OBhOOBi++8nw0KYGBgDQppZuaWh+OBruWkseaVl+S+iw0KYGBge3J9DQojaWYgc3RhdGVtZW50DQphIDwtIDMgI2HjgajjgYTjgYbjgqrjg5bjgrjjgqfjgq/jg4jjgasz44KS5Luj5YWlDQppZihhID4gMykge+OAgCPjgIxhID4gM+OAjeOBqOOBhOOBhuadoeS7tuW8j+OBp+adoeS7tuWIhuWykOOBleOBm+OCiw0KICAj44CMYSA+IDPjgI3jgajjgYTjgYbmnaHku7blvI/jgYznnJ/jga7jgajjgY3jgavmrKHjga7jgrPjg7zjg4njgYzlrp/ooYzjgZXjgozjgosNCiAgY2F0KCJhIGlzIGdyZWF0ZXIgdGhhbiAzLiIsICJcbiIpICN0aGlzIGlzIGV4ZWN1dGVkIHdoZW4gdGhlIGNvbmRpdGlvbiBpcyB0cnVlDQp9IA0KZWxzZSB744CAI+OAjGEgPiAz44CN44Go44GE44GG5p2h5Lu25byP44GM5YG944Gu44Go44GN44Gr5qyh44Gu44Kz44O844OJ44GM5a6f6KGM44GV44KM44KLDQogIGNhdCgiYSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMy4iLCAiXG4iKSAjVGhpcyBpcyBleGVjdXRlZCB3aGVuIHRoZSBjb25kaXRpb24gaXMgbm90IHRydWUNCn0NCmBgYA0KIyMjIyBlbHNlIGlm5paHDQpgYGB7cn0NCmEgPC0gMg0KaWYoYSA+IDMpIHsgICPmnaHku7blvI/jga7jg4Hjgqfjg4Pjgq8NCiAgY2F0KCJhIGlzIGdyZWF0ZXIgdGhhbiAzLiIsICJcbiIpICPjgIxhID4gM+OAjeOBqOOBhOOBhuadoeS7tuW8j+OBjOecn+OBruOBqOOBjeOBq+OBk+OBruOCs+ODvOODieOBjOWun+ihjOOBleOCjOOCiw0KfSBlbHNlIGlmKGEgPiAxKSB7DQogIGNhdCgiYSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMyBidXQgZ3JlYXRlciB0aGFuIDEuIiwgIlxuIikgI+OAjGEgPiAz44CN44Go44GE44GG5p2h5Lu25byP44GM5rqA44Gf44GV44KM44Ga44CB44GL44Gk44CMYSA+IDHjgI3jgYzmuoDjgZ/jgZXjgozjgovjgajjgY3jgavjgZPjga7jgrPjg7zjg4njgYzlrp/ooYzjgZXjgozjgosNCn0gZWxzZXsNCiAgY2F0KCJhIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxLiIsICJcbiIpICPjgIxhID4gM+OAjeOBqOOBhOOBhuadoeS7tuW8j+OBjOa6gOOBn+OBleOCjOOBmuOAgeOBi+OBpOOAjGEgPiAx44CN44KC5rqA44Gf44GV44KM44Gq44GE44Go44GN44Gr44GT44Gu44Kz44O844OJ44GM5a6f6KGM44GV44KM44KLDQp9DQpgYGANCiMjIyA0LjIuMiDnubDjgorov5TjgZflh6bnkIY944Or44O844OXKGZvciBsb29wKQ0K44Or44O844OX44Gu5L6LDQpgYGB7cn0NCm4gPC0gMTAgI+ODq+ODvOODl+OBruWbnuaVsOOCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiG7jgpLnlKjmhI/jgZfjgabjgIExMOOCkuS7o+WFpQ0Kc3VtIDwtIDDjgIAjc3Vt44Go44GE44GG44Kq44OW44K444Kn44Kv44OI44Gu5Yid5pyf5YCk44KSMOOBq+ioreWumg0KDQojZm9yIGxvb3Ag44CM44OW44Ot44OD44Kv44CNDQpmb3IoaiBpbiAxOm4pIHsgIygp44Gu5Lit44Gn44Or44O844OX44Gu6ZaL5aeL54K5KGogPSAxKeOBqOe1guS6hueCuShqID0gbinjgpLmjIflrpoNCiAgc3VtIDwtIHN1bSArIGrjgIAjc3Vt44Gu5YCk44GrauOCkui2s+OBl+OBn+OCguOBruOCkuS4iuabuOOBjeOBmeOCiw0KfQ0KcHJpbnQoc3VtKeOAgCPjg6vjg7zjg5fntYLkuoblvozjga5zdW3jga7lgKTjgpLooajnpLrjgZnjgosNCg0KYGBgDQoo44Or44O844OX44KS5L2/44KP44Gq44GE5aC05ZCIKQ0KYGBge3J9DQpzdW0gPC0gMSArIDIgKyAzICsgNCArIDUgKyA2ICsgNyArIDggKyA5ICsgMTANCnByaW50KHN1bSkNCmBgYA0KIyMjIDQuMi4zIOmWouaVsA0KIyMjIyDplqLmlbDlrprnvqnjga7lvaLlvI8NCmBgYHtyfQ0K6Zai5pWw5ZCNIDwtIGZ1bmN0aW9uKOODkeODqeODoeODvOOCv+WQjSA9IOODh+ODleOCqeODq+ODiOOBruW8leaVsOWApCkgew0KICDplqLmlbDjga7kuK3ouqsNCiAgcmV0dXJuKOaIu+OCiuWApCkNCn0NCmBgYA0KIyMjIyDplqLmlbDjga7kvb/nlKjkvosNCumWouaVsOWumue+qeOBruS+izENCmBgYHtyfQ0KZl9zdW0gPC0gZnVuY3Rpb24obiA9IDEwKSB7DQogIHN1bSA8LSBuKihuICsgMSkvMg0KICByZXR1cm4oc3VtKQ0KfQ0KYGBgDQrplqLmlbDjga7lkbzjgbPlh7rjgZcNCmBgYHtyfQ0KZl9zdW0obiA9IDUpDQpmX3N1bSgpDQpgYGANCumWouaVsOWumue+qeOBqOWRvOOBs+WHuuOBl+OBruS+izINCmBgYHtyfQ0KI+S7u+aEj+OBrm7jgYvjgolt44G+44Gn6Laz44GX566X44KS44GZ44KL6Zai5pWwDQpmX3N1bTIgPC0gZnVuY3Rpb24obiA9IDMsIG0pIHsNCiAgc3VtIDwtIDAgI+WIneacn+WApOOBruioreWumg0KICAjZm9yIGxvb3DjgpLkvb/jgaPjgabotrPjgZfnrpfjga7nubDjgorov5TjgZfjgpLlrp/nj74NCiAgZm9yKGogaW4gbjptKSB7ICNmb3IgbG9vcOOBrumWi+Wni+eCueOBr24sIOe1guS6hueCueOBr20NCiAgICBzdW0gPC0gc3VtICsgag0KICB9DQogIHJldHVybihzdW0pDQp9DQoj6Zai5pWw5ZG844Gz5Ye644GX77yG5Luj5YWlDQp0ZXN0IDwtIGZfc3VtMihuID0gMTAwLCBtID0gMTAwMCkgI+mWouaVsOOCkuWRvOOBs+WHuuOBl+OBpuOAgeaIu+OCiuWApOOCknRlc3Tjgavku6PlhaUNCnRlc3QNCmBgYA0KIyMjIyDplqLmlbDlrprnvqnjg7vlkbzjgbPlh7rjgZfjgavjgYrjgZHjgovlpLHmlZfjg53jgqTjg7Pjg4gNCuWumue+qeOBleOCjOOBpuOBhOOBquOBhOODkeODqeODoeODvOOCv+OBq+W8leaVsOOCkua4oeOBmeWgtOWQiA0KYGBge3J9DQpmX3N1bShuID0gMTAwLCBtID0gMTAwMCkNCmBgYA0K44OH44OV44Kp44Or44OI44Gu5byV5pWw44GM5oyH5a6a44GV44KM44Gm44GE44Gq44GE6Zai5pWw44Gq44Gu44Gr5byV5pWw44KS5oyH5a6a44GX44Gq44GL44Gj44Gf5aC05ZCIDQpgYGB7cn0NCmZfc3VtMihuID0gMTAwKQ0KYGBgDQoNCg==