関数の作り方

和や平均など簡単な関数は R に標準実装されているため、そのまま呼び出して使うことができる。しかし、複雑な処理を行おうとすれば、自力で数式をプログラムに変換して、関数を作り上げていく必要がある。

基本的な作り方

関数は、function () { } を利用して作成する。丸括弧には、関数内で利用する引数を書き入れる。波括弧の中には、実際の処理を書き入れる。例えば、2 つの引数(xy)を受け取り、その差を返す関数は次のように作成する。ただし、関数は dis と命名している。

dis <- function(x, y) {
  sa <- x - y              # 差を求める
  return(sa)
}

自作した関数 dis は以下のように利用する。

dis(30, 10)
## [1] 20

# 引数の名前を明示すれば、順序を入れ替えても可能
dis(y = 10, x = 30)   
## [1] 20

関数を利用するにあたって、引数が足りないときにエラーが発生する。例えば、dis 関数の場合、2 つ目の引数 y を省略すると、以下のようなエラーが発生する。

dis(30)
## Error in x - y : 'y' is missing

x が省略されたときに 30 を代入し、また y が省略されたときに 0 を代入するように設定することができる。

dis <- function(x = 30, y = 0) {
  sa <- x - y
  return(sa)
}

dis(20)        # y を省略(y には 0 が自動代入される)
## [1] 20

dis()          # x と y の両方を省略 (x には 30、y には 0 が自動代入される)
## [1] 30

return と invisible

関数で様々な演算を行った後に、計算結果を返すときは return または invisible を利用する。両者の働きはほぼ同じ。return の場合は、計算結果を返すと同時に画面上に表示させる。一方、invisible は計算結果を返し、画面上に表示させない。

# return で返す関数
plus1 <- function(x = 0, y = 0) {
  wa <- x + y
  return(wa)
}

# invisible で返す関数
plus2 <- function(x = 0, y = 0) {
  wa <- x + y
  invisible(wa)
}

関数の計算結果を受け取る変数がある場合、計算結果が変数に代入されるため、returninvisible の見え方は同じ。

x1 <- plus1(10, 20)
x1
## [1] 30

x2 <- plus2(10, 20)
x2
## [1] 30

一方、関数の計算結果を受け取る変数がない場合は、return は計算結果を画面上に表示させる。これに対して、invisible は計算結果を画面上に表示させない、見かけ上、何も起こっていないように見える。

plus1(10, 20)
## [1] 30

plus2(10, 20)

関数内部で引数と値をリスト化

関数の内部で、関数に与えられた引数とその値をリストに保存する方法。


f <- function(a, b, c, ...) {
  fcall <- as.list(match.call(expand.dots = TRUE))
  print(fcall$a)
  print(fcall)
}

f(a = 1, b = "A", c = "a")
## [1] 1
##
## [[1]]
## f
## $a
## [1] 1
## $b
## [1] "A"
## $c
## [1] "a"

f(a = 1, b = "A", c = "a", d = 1024)
## [1] 1
## 
## [[1]]
## f
## $a
## [1] 1
## $b
## [1] "A"
## $c
## [1] "a"
## $d
## [1] 1024