Menu
Coddy logo textTech

関数を渡す

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

関数は別の関数を引数として受け取り、それを呼び出すことができます。以下の apply_twice() は、引数を1つ取る任意の関数で動作します:

apply_twice <- function(f, x) f(f(x))
print(apply_twice(\(x) x + 3, 10))
print(apply_twice(toupper, "ok"))

出力:

[1] 16
[1] "OK"

sum、max、toupperのような組み込み関数も値なので、括弧を付けずに名前で渡します。括弧を付けると、代わりに呼び出されます。

summarize <- function(xs, how) how(xs)
print(summarize(c(4, 9, 2), max))
print(summarize(c(4, 9, 2), sum))

出力:

[1] 9
[1] 15

述語(TRUEまたはFALSEを返す関数)を受け取る関数は、任意の規則によって値を数えたり選択したりできます。

count_if <- function(xs, keep) {
  n <- 0
  for (x in xs) if (keep(x)) n <- n + 1
  n
}
print(count_if(c(3, 8, 10, 5), \(x) x %% 2 == 0))
print(count_if(c(3, 8, 10, 5), \(x) x > 4))

出力:

[1] 2
[1] 3

呼び出し側が動作を決定し、関数がループを提供するため、1つの関数で多くのケースに対応できます。

transform_each <- function(xs, f) {
  out <- c()
  for (x in xs) out <- c(out, f(x))
  out
}
print(transform_each(1:4, \(x) x * 10))
print(transform_each(c("a", "b"), toupper))

出力:

[1] 10 20 30 40
[1] "A" "B"
challenge icon

チャレンジ

簡単

apply_n(f, x, n)を完成させてください。fをxに適用し、次にその結果に適用する操作を、合計でn回行い、最終的な値を返します。nが0の場合は、xを変更せずに返します。

与えられたコードでは、double、inc、halfという3つの関数が定義されています。これらのうち1つの名前、開始値、nを読み取り、apply_n()の結果を出力します。

自分で試してみよう

apply_n <- function(f, x, n) {
  # ここにコードを書いてください
  x
}

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

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

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

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