0Pricing
R Academy · Pelajaran

reduce(), accumulate(), dan walk()

Lipat daftar, bangun hasil kumulatif, dan terapkan efek samping dengan walk().

reduce(), accumulate(), dan walk() adalah pelajaran R Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar R Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus R Academy mencakup 4 pelajaran total.

Di Luar map() — Kata Kerja purrr Lainnya

Walaupun map() menerapkan fungsi secara mandiri pada setiap elemen, beberapa tugas memerlukan operasi yang menggabungkan elemen (reduce), mengakumulasikan hasil antara, atau menerapkan fungsi hanya untuk efek samping (walk). purrr menyediakan fungsi khusus untuk setiap kebutuhan tersebut.

library(purrr)

# Example: combining a list of numbers into a single value
nums <- list(1, 2, 3, 4, 5)

# We want: 1 + 2 + 3 + 4 + 5 = 15
# map() can't do this — it returns 5 separate results
# reduce() folds the list into one value
result <- reduce(nums, `+`)
cat('Sum via reduce:', result)

reduce() — Melipat Daftar Menjadi Satu Nilai

reduce(.x, .f, .init) menerapkan .f secara kumulatif pada elemen .x, dari kiri ke kanan, sehingga daftar direduksi menjadi satu nilai. reduce(list(a,b,c), f) menghitung f(f(a,b),c).

library(purrr)

# reduce with max: find the overall maximum
values <- list(42, 17, 89, 55, 23)
result <- reduce(values, max)
cat('Maximum:', result, '\n')

# reduce with paste: concatenate strings
words <- list('The', 'quick', 'brown', 'fox')
reduce(words, paste)

reduce() dengan .init

Argumen .init menyediakan nilai awal (seed). Pemanggilan pertama menjadi f(.init, x[1]). Ini penting ketika daftar mungkin kosong (hasil reduksinya adalah .init) atau ketika Anda memerlukan keadaan awal tertentu.

library(purrr)

# Running count of elements matching a condition
data <- list(5, 12, 3, 18, 7, 15, 2)

# Count values greater than 10, starting from 0
reduce(data, function(count, x) count + (x > 10), .init = 0L)

# Also useful for string building:
reduce(c('A','B','C'), paste, sep='-', .init='START')

reduce() dengan Bingkai Data — Merangkai Penggabungan

Salah satu penggunaan reduce() yang paling kuat adalah menggabungkan daftar bingkai data. Daripada menulis left_join(left_join(df1, df2), df3), gunakan reduce(list_of_dfs, left_join, by='key').

library(purrr)
library(dplyr)

base_df <- data.frame(id=1:3, name=c('Alice','Bob','Carol'))
scores <- data.frame(id=1:3, score=c(85,90,78))
grades <- data.frame(id=1:3, grade=c('B','A','C'))
city <- data.frame(id=1:3, city=c('NYC','LA','Chicago'))

dfs <- list(base_df, scores, grades, city)

reduce(dfs, left_join, by='id')

accumulate() — Mempertahankan Hasil Antara

accumulate(.x, .f) mirip dengan reduce(), tetapi mempertahankan semua nilai antara. Fungsi ini mengembalikan vektor (atau daftar) dengan panjang yang sama seperti masukan, yang menunjukkan hasil berjalan setelah setiap langkah.

library(purrr)

# Running sum — same as cumsum() but via accumulate
values <- c(100, 120, 95, 140, 160)
accumulate(values, `+`)

# Running maximum
accumulate(c(50, 52, 48, 55, 53, 58), max)

accumulate() untuk Hasil Langkah demi Langkah

accumulate() sangat berguna untuk menelusuri langkah-langkah algoritma, membangun string karakter demi karakter, atau proses apa pun yang mengharuskan Anda memeriksa setiap keadaan antara, bukan hanya hasil akhirnya.

library(purrr)

# Compound interest step by step
principal <- 1000
rates <- c(0.05, 0.05, 0.05, 0.05, 0.05)  # 5% per year

accumulate(rates, function(balance, rate) {
  round(balance * (1 + rate), 2)
}, .init = principal)

walk() — Efek Samping Tanpa Keluaran

walk(.x, .f) menerapkan .f pada setiap elemen .x semata-mata untuk efek sampingnya (mencetak, menulis file, atau mengirim pesan). Fungsi ini secara tak terlihat mengembalikan .x, sehingga Anda dapat menggunakannya dalam alur kerja tanpa memutus rangkaian.

library(purrr)

# Print a summary for each dataset
datasets <- list(
  mtcars = mtcars[,1:3],
  iris = iris[,1:3]
)

walk(datasets, function(df) {
  cat('Rows:', nrow(df), '| Cols:', ncol(df),
      '| NAs:', sum(is.na(df)), '\n')
})

walk() dalam Alur Kerja

Karena walk() secara tak terlihat mengembalikan .x, Anda dapat menyisipkannya ke dalam alur kerja dplyr untuk mencatat atau mencetak hasil antara tanpa memutus alirannya. Anggaplah fungsi ini sebagai titik penyadap untuk penelusuran galat atau pencatatan.

library(purrr)
library(dplyr)

results <- list(
  East = data.frame(rep=c('A','B'), sales=c(100,120)),
  West = data.frame(rep=c('C','D'), sales=c(200,190))
)

# Log each region's data, then continue processing
region_totals <- results %>%
  walk(~cat('Processing:', nrow(.x), 'rows\n')) %>%
  map_dbl(~sum(.x$sales))

print(region_totals)

walk2() — Efek Samping dengan Dua Masukan

walk2(.x, .y, .f) adalah versi dua masukan dari walk(). Salah satu penggunaan klasiknya adalah menulis beberapa bingkai data ke file, dengan .x sebagai daftar bingkai data dan .y sebagai daftar jalur file.

library(purrr)

data_list <- list(
  east = data.frame(x=1:3, y=4:6),
  west = data.frame(x=7:9, y=10:12)
)

file_paths <- list(
  '/tmp/east_data.csv',
  '/tmp/west_data.csv'
)

# Write each data frame to its corresponding path
walk2(data_list, file_paths, function(df, path) {
  write.csv(df, path, row.names=FALSE)
  cat('Written:', path, '\n')
})

iwalk() — Walk dengan Indeks

iwalk(.x, .f) mirip dengan walk(), tetapi meneruskan nama elemen (atau indeks) sebagai argumen kedua, .y. Ini berguna ketika Anda perlu mengetahui elemen mana yang sedang diproses dalam efek samping tersebut.

library(purrr)

region_counts <- list(East=150, West=200, North=85, South=120)

# Print each region with its rank
iwalk(region_counts, function(count, name) {
  cat(name, ':', count, 'customers\n')
})

reduce_right() — Reduksi dari Kanan ke Kiri

reduce(.x, .f, .dir='backward') (atau reduce_right() yang sudah tidak digunakan lagi) menerapkan fungsi dari kanan ke kiri: f(a, f(b, f(c, d))). Hal ini penting untuk operasi yang tidak komutatif, seperti pengurangan atau pembangunan string.

library(purrr)

words <- c('fox','brown','quick','The')

# Left-to-right: 'The quick brown fox'
reduce(rev(words), paste)

# Right-to-left: same effect but starting from right
reduce(words, function(a, b) paste(b, a))

Pemeriksaan Singkat

Kapan Anda sebaiknya menggunakan walk(), bukan map()?

Rangkuman: reduce, accumulate, walk

Hal-hal penting tentang reduce, accumulate, dan walk:

  • reduce(.x, .f) — melipat daftar menjadi satu nilai (dari kiri ke kanan); .init menetapkan nilai awal
  • reduce(list_of_dfs, left_join) — pola yang kuat untuk merangkai penggabungan
  • accumulate(.x, .f) — seperti reduce, tetapi mengembalikan semua hasil antara
  • walk(.x, .f) — menerapkan fungsi untuk efek samping (mencetak, menulis, mencatat); mengembalikan .x
  • walk2(.x, .y, .f) — walk dengan dua masukan (misalnya, bingkai data + jalur file)
  • iwalk(.x, .f) — walk dengan nama elemen sebagai argumen kedua
library(purrr)
library(dplyr)

# reduce() joins a list of data frames, accumulate() shows interim states
monthly_sums <- c(100, 120, 95, 140, 160, 130)

cat('reduce (total):      ', reduce(monthly_sums, `+`), '\n')
cat('accumulate (running):', accumulate(monthly_sums, `+`), '\n')

# walk() for side-effect logging
results <- list(a=42, b=17, c=89)
walk(results, ~cat('Value:', .x, '\n'))

Pertanyaan yang Sering Diajukan

Apakah pelajaran “reduce(), accumulate(), dan walk()” gratis?

Ya — teks lengkap “reduce(), accumulate(), dan walk()” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus R Academy, upgrade ke CoddyKit PRO. Kursus R Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “reduce(), accumulate(), dan walk()”?

Lipat daftar, bangun hasil kumulatif, dan terapkan efek samping dengan walk(). Kamu berlatih R Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai R Academy?

Tidak diperlukan pengalaman sebelumnya. R Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “reduce(), accumulate(), dan walk()” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran R Academy ini?

Ya. Setiap pelajaran R Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. map() dan Variasi Bertipe
  2. map2() dan pmap() untuk Banyak Input
  3. reduce(), accumulate(), dan walk()
  4. keep(), discard(), dan Penyaringan Daftar
← Kembali ke R Academy