keep(), discard() dan Penapisan Senarai
Tapis unsur senarai mengikut fungsi predicate untuk pipeline yang kemas.
keep(), discard() dan Penapisan Senarai ialah pelajaran R Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran R Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus R Academy merangkumi sejumlah 4 pelajaran.
Menapis Senarai dengan purrr
purrr menyediakan sekumpulan fungsi untuk menapis, mencari dan menguji senarai berdasarkan predikat. Predikat ialah fungsi yang mengembalikan TRUE atau FALSE. Fungsi ini menggantikan panggilan Filter() dan gelung 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() — Mengekalkan Elemen yang Memenuhi Predikat
keep(.x, .p) hanya mengekalkan elemen .x yang predikat .p-nya mengembalikan TRUE. Ia bertentangan dengan discard(). Predikat boleh berupa nama fungsi, formula atau vektor logik.
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() — Mengalih Keluar Elemen yang Memenuhi Predikat
discard(.x, .p) mengalih keluar elemen yang predikatnya mengembalikan TRUE dan mengekalkan yang lain. Ia ialah pasangan berlawanan bagi keep(). Gunakannya untuk menapis keluar nilai kosong, NA atau jenis yang tidak dikehendaki daripada senarai.
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() — Mengalih Keluar Elemen NULL
compact(.x) mengalih keluar semua elemen NULL daripada senarai — setara dengan discard(.x, is.null) tetapi lebih ringkas. Ia amat berguna selepas panggilan map() yang mungkin mengembalikan NULL untuk sesetengah input.
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() — Mencari Padanan Pertama
detect(.x, .p) mengembalikan elemen pertama yang memenuhi predikat. Jika tiada elemen yang sepadan, ia mengembalikan NULL. Gunakan detect(.right=TRUE) untuk mencari dari kanan dan mendapatkan padanan 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() — Mencari Kedudukan Padanan Pertama
detect_index(.x, .p) mengembalikan indeks elemen pertama yang memenuhi predikat (atau 0L jika tiada yang ditemui). Ini berguna apabila anda memerlukan kedudukan, bukan nilai — contohnya, untuk mengemas kini 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() — Adakah Semua Elemen Sepadan?
every(.x, .p) mengembalikan TRUE jika predikat dipenuhi oleh setiap elemen. Ia berhenti pada FALSE pertama. Setara dengan all(map_lgl(.x, .p)) tetapi dinilai 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() — Adakah Mana-mana Elemen Sepadan?
some(.x, .p) mengembalikan TRUE jika sekurang-kurangnya satu elemen memenuhi predikat. Ia berhenti pada TRUE pertama. Setara dengan any(map_lgl(.x, .p)) tetapi dinilai 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() — Adakah Tiada Elemen Sepadan?
none(.x, .p) mengembalikan TRUE jika tiada elemen memenuhi predikat. Ia setara dengan !some(.x, .p) tetapi lebih jelas dalam konteks pengesahan apabila anda ingin memastikan ketiadaan sesuatu keadaan.
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()
Menghubungkan keep() (atau discard()) dengan map() ialah corak yang biasa digunakan: mula-mula tapis senarai untuk mendapatkan unsur yang berkaitan, kemudian gunakan transformasi. Dengan cara ini, logik penapisan diasingkan daripada logik pemprosesan dengan jelas.
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 terbina dalam R, iaitu is.* (is.numeric, is.character, is.null, is.na, is.finite), boleh digunakan secara langsung sebagai predikat dalam keep() dan discard() tanpa perlu dibungkus dengan ~.
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))Semakan Pantas
Apakah yang dikembalikan oleh detect(.x, .p) apabila tiada unsur dalam .x memenuhi predikat .p?
Ulang Kaji: Fungsi Penapisan Senarai
Perkara utama tentang alat penapisan senarai purrr:
keep(.x, .p)— kekalkan unsur yang predikatnya TRUEdiscard(.x, .p)— keluarkan unsur yang predikatnya TRUEcompact(.x)— keluarkan semua unsur NULLdetect(.x, .p)— kembalikan unsur pertama yang sepadan dengan predikat (atau NULL)detect_index(.x, .p)— kembalikan indeks padanan pertama (atau 0L)every(.x, .p)— TRUE jika semua unsur sepadansome(.x, .p)— TRUE jika mana-mana unsur sepadannone(.x, .p)— TRUE jika tiada unsur sepadan
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))Pelajari R dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 43
- Pelajaran
- 159
Soalan Lazim
Adakah pelajaran “keep(), discard() dan Penapisan Senarai” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran R Academy, termasuk “keep(), discard() dan Penapisan Senarai”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus R Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “keep(), discard() dan Penapisan Senarai”?
Tapis unsur senarai mengikut fungsi predicate untuk pipeline yang kemas. Anda berlatih R Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan R Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran R Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “keep(), discard() dan Penapisan Senarai” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran R Academy ini?
Ya. Setiap pelajaran R Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- map() dan Varian Bertipe
- map2() dan pmap() untuk Berbilang Masukan
- reduce(), accumulate() dan walk()
- keep(), discard() dan Penapisan Senarai