Menu
Coddy logo textTech

関数を返す

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

関数は関数を返すこともできます。make_multiplier(3)は、引数に3を掛ける新しい関数を返します。

make_multiplier <- function(n) {
  function(x) x * n
}
triple <- make_multiplier(3)
print(triple(5))
print(make_multiplier(10)(5))

出力:

[1] 15
[1] 50

返された関数は、それが作成されたときの値を記憶しています。この関数と、その周囲にある変数の組み合わせをクロージャと呼びます。makerを呼び出すたびに、別々のクロージャが作成されます。

make_greeter <- function(greeting) {
  function(name) paste0(greeting, ", ", name, "!")
}
hello <- make_greeter("Hello")
hola <- make_greeter("Hola")
print(hello("Ada"))
print(hola("Ada"))

出力:

[1] "Hello, Ada!"
[1] "Hola, Ada!"

メーカ関数は、いくつかの設定をすぐに使えるツールに変換します。たとえば、単位間の変換器などです。

make_converter <- function(factor, offset = 0) {
  function(x) x * factor + offset
}
c_to_f <- make_converter(1.8, 32)
km_to_miles <- make_converter(0.621)
print(c_to_f(100))
print(km_to_miles(10))

出力:

[1] 212
[1] 6.21

関数は組み合わせて新しい関数を作ることができます。compose(f, g)は、fを実行してからgを実行する関数を返します:

compose <- function(f, g) function(x) g(f(x))
clean <- compose(trimws, toupper)
print(clean("  hi there "))

出力:

[1] "HI THERE"
challenge icon

チャレンジ

簡単

make_formatter(prefix, digits)を完成させてください。これは数値を受け取り、prefixに続けてdigits桁の小数を持つ数値を返す関数を返します。make_formatter("$", 2)(3.5)は$3.50を返します。

sprintf("%.*f", digits, x)は、xを小数点以下digits桁で書式設定します。

提供されたコードは、prefix、小数点以下の桁数、カンマ区切りの数値リストを読み取ります。1つのフォーマッターを作成し、各数値に対する結果を出力します。

自分で試してみよう

make_formatter <- function(prefix, digits) {
  # ここにコードを書いてください
  function(x) ""
}

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

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

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

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