匿名関数
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] 10R 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チャレンジ
簡単リスト 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")
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Rオンラインコンパイラ