keep(), discard(), dan Penyaringan Daftar
Saring elemen daftar berdasarkan fungsi predikat untuk alur kerja yang bersih.
keep(), discard(), dan Penyaringan Daftar adalah pelajaran R Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.
Memfilter Daftar dengan purrr
purrr menyediakan sekumpulan fungsi untuk memfilter, mencari, dan menguji daftar berdasarkan predikat. Predikat adalah fungsi yang mengembalikan TRUE atau FALSE. Fungsi-fungsi ini menggantikan pemanggilan Filter() dan perulangan bersyarat yang panjang.
library(purrr)
# A mixed list to filter
mixed <- list(1L, 'hello', 3.14, NULL, TRUE, 42L, 'world', NULL)
cat('Total elements:', length(mixed), '\n')
cat('Non-NULL elements:', length(compact(mixed)))keep() — Mempertahankan Elemen yang Cocok dengan Predikat
keep(.x, .p) hanya mempertahankan elemen .x yang predikat .p-nya mengembalikan TRUE. Fungsi ini merupakan kebalikan dari discard(). Predikat dapat berupa nama fungsi, formula, atau vektor logika.
library(purrr)
mixed <- list(1L, 'hello', 3.14, TRUE, 42L, 'world', 2.7)
# Keep only numeric values
numeric_only <- keep(mixed, is.numeric)
print(numeric_only)
# Keep values greater than 5
keep(mixed, ~is.numeric(.x) && .x > 5)discard() — Menghapus Elemen yang Cocok dengan Predikat
discard(.x, .p) menghapus elemen yang predikatnya mengembalikan TRUE dan mempertahankan sisanya. Fungsi ini merupakan kebalikan dari keep(). Gunakan untuk menyaring NULL, NA, atau tipe yang tidak diinginkan dari daftar.
library(purrr)
results <- list(
model_a = list(rmse=2.5, converged=TRUE),
model_b = list(rmse=NA, converged=FALSE),
model_c = list(rmse=1.8, converged=TRUE),
model_d = list(rmse=NA, converged=FALSE)
)
# Discard models that did not converge
converged_models <- discard(results, ~!.x$converged)
map_dbl(converged_models, ~.x$rmse)compact() — Menghapus Elemen NULL
compact(.x) menghapus semua elemen NULL dari daftar—setara dengan discard(.x, is.null), tetapi lebih ringkas. Fungsi ini sangat berguna setelah pemanggilan map() yang mungkin mengembalikan NULL untuk beberapa masukan.
library(purrr)
# Simulate fetching data that might return NULL
ids <- 1:6
fetch_data <- function(id) {
if (id %% 2 == 0) NULL else list(id=id, value=id*10)
}
raw_results <- map(ids, fetch_data)
cat('With NULLs:', length(raw_results), '\n')
clean_results <- compact(raw_results)
cat('Without NULLs:', length(clean_results))detect() — Menemukan Kecocokan Pertama
detect(.x, .p) mengembalikan elemen pertama yang memenuhi predikat. Jika tidak ada elemen yang cocok, fungsi ini mengembalikan NULL. Gunakan detect(.right=TRUE) untuk mencari dari kanan dan menemukan kecocokan terakhir.
library(purrr)
prices <- list(15.99, 8.50, 23.99, 5.25, 19.99, 4.75)
# Find first price under $10
first_cheap <- detect(prices, ~.x < 10)
cat('First price under $10:', first_cheap, '\n')
# Find last price under $10
last_cheap <- detect(prices, ~.x < 10, .right=TRUE)
cat('Last price under $10:', last_cheap)detect_index() — Menemukan Posisi Kecocokan Pertama
detect_index(.x, .p) mengembalikan indeks elemen pertama yang memenuhi predikat (atau 0L jika tidak ditemukan). Ini berguna ketika Anda memerlukan posisinya, bukan nilainya—misalnya, untuk memperbarui atau mengekstrak elemen tersebut.
library(purrr)
models <- list(
list(name='lm', rmse=3.5),
list(name='rf', rmse=2.1),
list(name='xgb', rmse=1.8),
list(name='svm', rmse=2.4)
)
# Find the index of the best model (lowest RMSE)
best_idx <- detect_index(models, function(m) m$rmse < 2.0)
cat('Best model index:', best_idx, '\n')
cat('Best model name:', models[[best_idx]]$name)every() — Apakah Semua Elemen Cocok?
every(.x, .p) mengembalikan TRUE jika predikat terpenuhi untuk setiap elemen. Evaluasi dihentikan pada FALSE pertama. Ini setara dengan all(map_lgl(.x, .p)), tetapi dievaluasi secara malas.
library(purrr)
batch_results <- list(
list(status='success', rows=150),
list(status='success', rows=200),
list(status='success', rows=175)
)
failed_batch <- list(
list(status='success', rows=150),
list(status='error', rows=0),
list(status='success', rows=175)
)
cat('All success (good):', every(batch_results, ~.x$status == 'success'), '\n')
cat('All success (bad):', every(failed_batch, ~.x$status == 'success'))some() — Apakah Ada Elemen yang Cocok?
some(.x, .p) mengembalikan TRUE jika setidaknya satu elemen memenuhi predikat. Evaluasi dihentikan pada TRUE pertama. Ini setara dengan any(map_lgl(.x, .p)), tetapi dievaluasi secara malas.
library(purrr)
datasets <- list(
data.frame(x=1:3, y=c(1,NA,3)),
data.frame(x=4:6, y=7:9),
data.frame(x=7:9, y=c(NA,NA,NA))
)
# Does any dataset contain NAs?
cat('Any NAs:', some(datasets, anyNA), '\n')
# Is every dataset NA-free?
cat('All clean:', every(datasets, ~!anyNA(.x)))none() — Apakah Tidak Ada Elemen yang Cocok?
none(.x, .p) mengembalikan TRUE jika tidak ada elemen yang memenuhi predikat. Ini setara dengan !some(.x, .p), tetapi lebih jelas dibaca dalam konteks validasi ketika Anda ingin memastikan tidak adanya suatu kondisi.
library(purrr)
api_responses <- list(
list(code=200, data='OK'),
list(code=200, data='OK'),
list(code=201, data='Created')
)
# Ensure no errors occurred
no_errors <- none(api_responses, ~.x$code >= 400)
cat('No errors:', no_errors, '\n')
# Check another batch
bad_batch <- c(api_responses, list(list(code=500, data='Error')))
none(bad_batch, ~.x$code >= 400)Menggabungkan keep() dengan map()
Merangkai keep() (atau discard()) dengan map() merupakan pola yang umum: pertama, saring daftar untuk mendapatkan elemen yang relevan, lalu terapkan transformasi. Dengan demikian, logika penyaringan terpisah dengan jelas dari logika pemrosesan.
library(purrr)
model_results <- list(
list(name='A', converged=TRUE, rmse=2.5),
list(name='B', converged=FALSE, rmse=NA),
list(name='C', converged=TRUE, rmse=1.8),
list(name='D', converged=TRUE, rmse=3.1)
)
# Keep converged, extract RMSE
model_results %>%
keep(~.x$converged) %>%
map_dbl(~.x$rmse)Menggunakan keep() dengan Fungsi is.*
Fungsi predikat bawaan R is.* (is.numeric, is.character, is.null, is.na, is.finite) dapat langsung digunakan sebagai predikat dalam keep() dan discard() tanpa perlu pembungkus ~.
library(purrr)
mixed_env <- list(
count = 42L,
name = 'Alice',
ratio = 3.14,
flag = TRUE,
missing = NULL,
data = data.frame(x=1:3)
)
# Extract different types
numeric_items <- keep(mixed_env, is.numeric)
cat('Numeric items:', length(numeric_items), '\n')
# Remove NULL items
cleaned <- discard(mixed_env, is.null)
cat('After removing NULL:', length(cleaned))Pemeriksaan Singkat
Apa yang dikembalikan oleh detect(.x, .p) ketika tidak ada elemen dalam .x yang memenuhi predikat .p?
Ringkasan: Fungsi Penyaringan Daftar
Hal-hal penting tentang alat penyaringan daftar dari purrr:
keep(.x, .p)— mempertahankan elemen yang predikatnya bernilai TRUEdiscard(.x, .p)— menghapus elemen yang predikatnya bernilai TRUEcompact(.x)— menghapus semua elemen NULLdetect(.x, .p)— mengembalikan elemen pertama yang cocok dengan predikat (atau NULL)detect_index(.x, .p)— mengembalikan indeks kecocokan pertama (atau 0L)every(.x, .p)— bernilai TRUE jika semua elemen cocoksome(.x, .p)— bernilai TRUE jika ada elemen yang cocoknone(.x, .p)— bernilai TRUE jika tidak ada elemen yang cocok
library(purrr)
scores <- list(45, 72, 88, 53, 91, 67, 39, 85)
passing <- keep(scores, ~.x >= 60)
failing <- discard(scores, ~.x >= 60)
cat('Passing:', length(passing), 'students\n')
cat('Failing:', length(failing), 'students\n')
cat('All pass:', every(scores, ~.x >= 60), '\n')
cat('Any fail:', some(scores, ~.x < 60), '\n')
cat('First pass score:', detect(scores, ~.x >= 60))Pertanyaan yang Sering Diajukan
Apakah pelajaran “keep(), discard(), dan Penyaringan Daftar” gratis?
Ya — teks lengkap “keep(), discard(), dan Penyaringan Daftar” 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 “keep(), discard(), dan Penyaringan Daftar”?
Saring elemen daftar berdasarkan fungsi predikat untuk alur kerja yang bersih. 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 4 dari 4.
Berapa lama pelajaran “keep(), discard(), dan Penyaringan Daftar” 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
- map() dan Variasi Bertipe
- map2() dan pmap() untuk Banyak Input
- reduce(), accumulate(), dan walk()
- keep(), discard(), dan Penyaringan Daftar