Menu
Coddy logo textTech

匿名関数

CoddyのRジャーニー「ロジックとフロー」セクションの一部。レッスン 27/64。

Rでは、関数は数値や文字列のような値です。function(x) x * 2は名前を付けずに関数を作成し、最後の式の値がその戻り値になります:

double <- function(x) x * 2
print(double(21))
print((function(x) x + 1)(9))

出力:

[1] 42
[1] 10

R 4.1では短縮形式が追加されました:\(x)はfunction(x)と同じ意味です。本体に複数行が必要な場合は、波括弧を使います:

square <- \(x) x^2
label <- function(x) {
  size <- if (x > 10) "big" else "small"
  paste(x, "is", size)
}
print(square(4))
print(label(12))

出力:

[1] 16
[1] "12 is big"

関数は値なので、リストは複数の関数を名前付きで保持できます。ops[["inc"]]は関数なので、ops[["inc"]](5)で呼び出せます:

ops <- list(inc = \(x) x + 1, neg = \(x) -x)
print(ops[["inc"]](5))
print(names(ops))

出力:

[1] 6
[1] "inc" "neg"

関数は、名前付き関数とまったく同じように、複数の引数を受け取り、その一部にデフォルト値を設定できます。

area <- \(w, h = w) w * h
print(area(3))
print(area(3, 5))

出力:

[1] 9
[1] 15
challenge icon

チャレンジ

簡単

リスト ops を、1つの引数を受け取る3つの無名関数で完成させてください:

  • double は引数に2を掛けた値を返します
  • square は引数にそれ自身を掛けた値を返します
  • negate は引数の符号を反転した値を返します

提供されたコードは、操作の名前と数値を読み取り、ops からその関数を呼び出して、結果を出力します。

自分で試してみよう

ops <- list(
  # ここにコードを書いてください
  double = function(x) x
)

# 提供された入出力コード:そのままにしておいてください
input <- suppressWarnings(readLines(file("stdin")))
f <- ops[[input[1]]]
cat(f(as.numeric(input[2])), sep = "\n")
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン

自分で練習してみよう: Rオンラインコンパイラ