制御構文

R の制御構文は一般的なもの。式の記述方法は複数あり、ブラケットで {} でくくる。可能であれば制御構文よりも同等の機能をもつ組み込み関数のほうが効率がよい。


if-else

# if (条件式) {式1} else {式2}
x <- rnorm(1)
if (x > 0) {
  a <- 1000
  } else {
  a <- 999
}
x
a

for

# for (繰り返し回数指定変数 in 繰り返し回数) {命令}
x <- 1
for (i in 1:5) {
x <- x + 1
}
x

while

# while (条件式) {命令} 条件式を満たされている間は命令を繰り返す。
x <- 1
while (x <= 5) { # xが5以下のときは (= xが6になったらやめる)
x <- x + 1 # xに1を足す
}
x

switch

一般的 (?) にはcase文になるのか。複数の場合わけを行う。

# xが1のときはaに"OK", 2のときは"NG", 3のときは"etc"を入れる。
x <- sample(3, 1)
switch(x,
  "1" = assign("a", "OK"),
  "2" = assign("a", "NG"),
  "3" = assign("a", "etc")
  )
a

# うまく使うとエレガントな文が書けそう。

ifelse

基本的にはExcelのif関数と同じ。if(条件式, 真のとき, 偽のとき)

x <- rnorm(1)
x
ifelse(x>0, "above", "below")

# オブジェクトへの付置はassign。付置したいオブジェクト名 (a) をダブルクォーテーションでくくること
x
ifelse(x>0, assign("a", "above"), assign("a", "below"))
a

ifelse(test,yes,no)


# t() 関数でできる行列の転置を制御構文を使ってやってみる。

mytrans <- function(x) {
  if (!is.matrix(x)) {
    warning("argument is not a matrix: returning NA")
    return(NA_real_)
  }
  y <- matrix(1, nrow=ncol(x), ncol=nrow(x))
  for (i in 1:nrow(x)) {
    for (j in 1:ncol(x)) {
      y[j,i] <- x[i,j]
    }
  }
return(y)
}

# try it
z <- matrix(1:10, nrow=5, ncol=2)
tz <- mytrans(z)