R 関数の基本

R 関数の基本

関数をつくることにより、 での作業がとても楽になります。 コードを繰り返して使うなら関数をつくりましょう。

関数の作り方

R の関数に 2 つのパーツがあります。

  • Arguments: 引数
  • Code block: 関数のコードは {} の間に納めます。
hello = function(x) {
  if(!is.character(x)) {
    stop("Please provide a character string.")
  }
  sprintf("Hello %s!", x)
}

hello(214)
Error in hello(214): Please provide a character string.
hello("Yukio")
[1] "Hello Yukio!"

関数のスコープ (scope)(1)

関数の中に作ったものは、関数の中にしか存在しない。

sumofsquare = function(x) {
  ss = (x - mean(x))^2 # 関数の外から見れない
  ssq = sum(ss) # 関数の外から見れない
  ssq # 関数の外に返す
}
data = sample(1:10, 5, replace = TRUE)
data
[1]  7  6 10  7  4
value = sumofsquare(data)
value
[1] 18.8

関数のスコープ (scope)(2)

ところが、関数は外の環境に存在するものは見れます。 このように関数を作ると、バグを起こしやすいので、注意。

sumofsquare = function(x) {
  ss = (s - mean(s))^2 # s は関数の外にあるが、関数の引数ではない
  ssq = sum(ss) # 関数の外から見れない
  ssq # 関数の外に返す
}
s = sample(100:1000, 5, replace = TRUE)
s
[1] 169 291 862 713 721
data = sample(1:10, 5, replace = TRUE)
data
[1] 5 7 9 7 3
value = sumofsquare(data)
value # これは s の平方和です。
[1] 365388.8

諸略した関数の書き方と無名関数 (anonymous function)

関数は次のようにもかけます。 \(x){...} はラムダ式 (lambda expression) とも呼ばれています。

add_one = \(x) { x + 1}
add_one(5)
[1] 6

無名関数をつくるときに便利な書き方です。

# どちれも無名関数ですが、2つ目の関数がはラムダ式です。
z = 1:5
sapply(z, FUN = function(s){s^2})
[1]  1  4  9 16 25
sapply(z, FUN = \(s){s^2})
[1]  1  4  9 16 25