【R講座】プログラミングの制御文とカスタム関数

R

研究室に配属されたばかりの新入生や、これからRで統計分析を始めたいと思っている方へ向けて、【R講座】では、RとRStudioの基本的な使い方から統計手法の選び方、基本的なデータ分析方法を解説しています。特にRが初めての方でも安心して学べるように、RStudioのクリック操作も紹介していきます。実際のコード例を交えながら進めるので、これからの研究やデータ分析に、役立てていただけたら嬉しいです。

みなさん、こんにちは!

前回のR講座では、ベクトルの基本について解説しました。

今回は、プログラミングに欠かせない基本的な制御文から、オリジナル関数の定義方法などを紹介していきます。

今回の内容
  • 制御文
  • オリジナル関数の定義

制御構文

Rの制御文を使うと、条件分岐や繰り返し処理を効率的に行えます。それぞれの文の使い方と使用例を詳しく解説します。

制御文役割
if条件が TRUE の場合に処理を実行
if-else条件が TRUE なら処理A、FALSE なら処理Bを実行
switch指定した値に応じて異なる処理を実行
for指定回数の繰り返し処理
while条件が TRUE の間繰り返し処理
repeatbreak されるまで無限ループ
breakループを強制終了
nextループの1回分の処理をスキップ

条件分岐(if, else, switch)

if

if は、指定した条件が TRUE の場合に処理を実行します。

if (条件式) {
# 条件がTRUEのときに実行される処理
}

# x に値を代入
x <- 10

# 制御文(条件分岐)
if (x > 5) {
  print("xは5より大きい")
}
[1] "xは5より大きい"
if-else

if と else を使うと、条件に応じて処理を分岐できます。if の条件が FALSE の場合に else の処理が実行されます。

if (条件式) {
# 条件がTRUEのときに実行される処理
} else {
# 条件がFALSEのときに実行される処理
}

# x に値を代入
x <- 3

# 制御文(条件分岐)
if (x > 5) {
  print("xは5より大きい")
} else {
  print("xは5以下")
}
[1] "xは5以下"
if-else if-else

複数の条件を評価したい場合は else if を使います。

if (条件1) {
# 条件1がTRUEのときの処理
} else if (条件2) {
# 条件2がTRUEのときの処理
} else {
# どの条件にも当てはまらないときの処理
}

# x に値を代入
x <- 0

# 制御文(条件分岐)
if (x > 0) {
  print("xは正の数")
} else if (x < 0) {
  print("xは負の数")
} else {
  print("xはゼロ")
}
[1] "xはゼロ"
switch

switch は複数の条件の中から該当するものを選択する際に便利です。

switch(変数,
値1 = 処理1,
値2 = 処理2,
値3 = 処理3,
...
)

# オブジェクト「fruit」にappleを格納
fruit <- "apple"

# 制御文(条件分岐)
switch (fruit,
        "apple" = "リンゴ",
        "banana" = "バナナ",
        "orange" = "オレンジ",
        "不明")

# fruitの中身がリストの中身と一致したら、文字(カタカナ)を返す
[1] "リンゴ"

if-else と switch は、どちらも条件分岐を行うための構文ですが、使い方や適した場面 が異なります。

if-elseの特徴
  • 条件が論理式 (TRUE/FALSE) で決まる
  • 複雑な条件の分岐が可能
  • 任意の比較演算 (>, <, ==, !=, %in% など) が使える
switchの特徴
  • 変数の値によって処理を分岐
  • シンプルな条件分岐向き(複雑な条件は if-else の方が適している)
  • 数値や文字列を直接評価(論理式は使えない)

繰り返し処理(for, while, repeat)

for

for は、一定回数の繰り返し処理を実行する際に使用します。

for (変数 in 値の範囲) {
# 繰り返し実行する処理
}

# 制御文(iが1〜5の間繰り返す)
for (i in 1:5) {
  print(i)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
while

while は、一定回数の繰り返し処理を実行する際に使用します。

while (条件式) {
# 条件がTRUEの間実行する処理
}

# x に1を代入
x <- 1

# 制御文(xが5以下になるまで繰り返す)
while (x <= 5) {
  print(x)
  x <- x + 1
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
repeat

repeat は、一定回数の繰り返し処理を実行する際に使用します。明示的に break することでループを終了します。

repeat {
# 無限ループする処理
if (条件) {
break # ループ終了
}
}

# x に1を代入
x <- 1

# 制御文(xを表示と加算を繰り返す; xが5より大きくなったら終了)
repeat {
  print(x)
  x <- x + 1
  if (x > 5) {
    break
  }
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5

for、while、repeat はすべて ループ処理 に使われる制御構造ですが、それぞれ適した用途や動作の違いがあります。

比較項目forwhilerepeat
用途繰り返し回数が決まっている場合条件が満たされている間繰り返す無限ループを作りたい場合
回数の決定事前に決める実行中に決まるbreak を使って決める
終了条件自動で終了条件を満たさなくなったら終了break を明示的に指定
主な用途ベクトルやリストの要素を処理事前に回数が分からないループ特定条件で終了するループ

ループ制御(break, next)

ループする繰り返し処理は、breaknextを使って制御します。

break

break を使うと、ループの途中で強制的に終了できます。多くの場合、if構文などの条件分岐を使って break の条件を決定します。

if (条件式) {
break # 条件式を満たしたらループ終了
}

# 制御文
for (i in 1:10) {
  if (i == 6) {
    break  # 6になったらループ終了
  }
  print(i)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
next

next を使うと、その回の処理をスキップして次のループへ進みます。多くの場合、if構文などの条件分岐を使って next の条件を決定します。

if (条件式) {
break # 条件式を満たしたらループ終了
}

# 制御文
for (i in 1:5) {
  if (i == 3) {
    next  # 3のときはスキップ
  }
  print(i)
}
[1] 1
[1] 2
[1] 4
[1] 5

これらの制御文を適切に活用して、プログラムを作成しましょう。

オリジナル関数の定義

Rでは、独自の関数を定義することで、コードの再利用性を高め、処理を効率化できます。ここでは、関数の基本的な定義方法、返り値の扱い、関数の保存と再利用について詳しく解説します。

基本的な関数の定義

Rで関数を定義するには、function()関数を用います。

function()関数の構造

関数名 <- function(引数1, 引数2, …) {
# 関数内の処理(ここにコードを書く)
return(返り値) # 省略可能
}

  • return() を省略すると、最後に評価された値が自動的に返されます。
  • return() は関数の処理を即座に終了させ、その値を返します。
  • return() の後にコードを書いても実行されません。
2つの数の和を求める関数を作成
# 関数の定義
add_numbers <- function(a, b) {
  result <- a + b
  return(result)
}

# 関数の実行
add_numbers(3, 5)
[1] 8

デフォルト引数の設定

関数の引数にはデフォルト値を設定できます。

デフォルト引数の設定

関数を定義するときに引数を設定し、引数を省略するとデフォルト引数が計算に使用されます。

デフォルト引数を使う
# 関数の定義
power_function <- function(base, exponent = 2) {
  return(base^exponent)
}

# デフォルト引数を使う
power_function(3)  # 3^2
[1] 9

引数を明示的に指定すると、指定した引数が計算に使用されます。

デフォルトの引数を変更して使う
# 関数の定義
power_function <- function(base, exponent = 2) {
  return(base^exponent)
}

# デフォルト引数を使う
power_function(3, 3)  # 3^3
[1] 27

関数の保存と再利用

Rで関数を定義した後、次回以降も使えるように保存する方法はいくつかあります。
ここでは、 Rスクリプト(.Rファイル) に保存する方法と、save() を使ってオブジェクトとして保存する方法について解説します。

Rスクリプトで保存・読み込み

Rスクリプトは、Rのコードをテキストファイルに保存したものです。この方法では、関数を .R ファイルとして保存し、必要なときに source() で読み込みます。

保存方法
RStudioを使う方法
  1. [File] → [New File] → [R Script] を選択
  2. 左上ペインのエディタに関数を書き込む
  3. [File] → [Save As…] を選択し保存
テキストエディタを使う方法
  1. メモ帳(Windows)、テキストエディット(Mac)、VSCode などのエディタを開く
  2. 関数を記述し、ファイル名に拡張子を .R にして保存
読み込み方法

Rスクリプトを保存したら、source() を使って読み込むことで、定義した関数を利用できます。

# my_functions.R を現在の作業ディレクトリから読み込む
source("my_functions.R")

もし、 my_functions.R が別のフォルダにある場合は、フルパスを指定します。

# my_functions.R を現在の作業ディレクトリから読み込む
source("/Users/YourName/Documents/my_functions.R")  

save() で保存・読み込み

スクリプトとして保存するほかに、関数を .RData ファイルとして保存し、後で読み込む方法もあります。

保存方法

save() を使うと、関数をオブジェクトとして .RData ファイルに保存できます。

# 関数を定義
my_function_1 <- function(a, b) {
  return(a + b)
}

my_function_2 <- function(a, b) {
  return(a * b)
}

# 2つの関数を"functions.RData" に保存
save(my_function_1, my_function_2, file = "functions.RData")
読み込み方法

保存した .RData ファイルを load() を使って読み込めば、関数を再利用できます。

# 保存した "functions.RData" を読み込む
load("functions.RData")
  • save() は 関数だけでなく、データフレームやベクトルなどのオブジェクトも保存可能
  • load() すると、保存されていたオブジェクトがすべて復元

Rスクリプトでの保存は、再利用しやすく、管理しやすいため、基本的には .Rスクリプトでの管理が推奨されます。ただし、関数やデータを大量に管理する場合は save() を活用すると便利です。

まとめ

まとめ
  • 制御文
    • 条件分岐(if・if-else if・switch
    • 繰り返し(for・while・repeat)→ breaknextで制御
  • オリジナル関数の定義
    • function()で作成
    • RスクリプトかRdataとして保存・再利用

今回は、プログラミングの基本とオリジナル関数の定義を紹介しました。

Rではプログラミングを活用することで、分析の半自動化や大量のデータ解析をしやすくなります。また、オリジナル関数によく使う作業を関数化しておくことで、作業スピードがアップします。

次回は、データの入力方法について紹介します。

タイトルとURLをコピーしました