和や平均など簡単な関数は R に標準実装されているため、そのまま呼び出して使うことができる。しかし、複雑な処理を行おうとすれば、自力で数式をプログラムに変換して、関数を作り上げていく必要がある。
基本的な作り方
関数は、function () { }
を利用して作成する。丸括弧には、関数内で利用する引数を書き入れる。波括弧の中には、実際の処理を書き入れる。例えば、2 つの引数(x
と y
)を受け取り、その差を返す関数は次のように作成する。ただし、関数は 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)
}
関数の計算結果を受け取る変数がある場合、計算結果が変数に代入されるため、return
と invisible
の見え方は同じ。
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