Reduce
CoddyのRジャーニー「ロジックとフロー」セクションの一部。レッスン 35/64。
Reduce(f, x) は x の要素を 1 つの値にまとめます。最初の 2 つの要素に対して f を呼び出し、次にその結果と 3 番目の要素に対して呼び出す、という処理を続けます。+ を使うと、すべてを加算します。
print(Reduce(function(acc, x) acc + x, c(3, 5, 10)))
print(Reduce(`+`, 1:5))出力:
[1] 18
[1] 15+ のような演算子も関数です。バッククォートで囲んだ `+` は、他の関数と同じように渡すことができます。Reduce() は、2つの単語のうち長いほうを保持する場合のように、その組み合わせに対応する組み込み関数がないときに特に便利です。
longer <- function(a, b) if (nchar(b) > nchar(a)) b else a
print(Reduce(longer, c("fig", "banana", "kiwi", "cherry")))出力:
[1] "banana"3番目の引数 init は開始値です。これは最初の acc として使用され、x が空の場合の結果にもなります:
print(Reduce(`+`, c(), 0))
print(Reduce(function(acc, w) paste0(acc, toupper(substr(w, 1, 1))), c("portable", "network", "graphics"), ""))出力:
[1] 0
[1] "PNG"accumulate = TRUE は最後の結果だけでなく、すべての中間結果を返すため、累積合計が得られます。
deposits <- c(100, -30, 50, -80)
print(Reduce(`+`, deposits, accumulate = TRUE))出力:
[1] 100 70 120 40チャレンジ
簡単running_balance(start, changes)を完成させてください。startから開始し、各変更を順番に適用します。変更ごとに、その変更後の残高を示す1行(after 1: 70)を返し、最後の行にはlowest: に続けて、到達した最低残高(startを含む)を返します。
用意されているコードは、開始残高と変更をカンマ区切りの行として読み込み、返された各行を出力します。
自分で試してみよう
running_balance <- function(start, changes) {
# ここにコードを書いてください
character(0)
}
# 提供された入出力コード:そのままにしておいてください
input <- suppressWarnings(readLines(file("stdin")))
cat(running_balance(as.numeric(input[1]), as.numeric(strsplit(input[2], ",")[[1]])), sep = "\n")
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Rオンラインコンパイラ