keep(), discard() ve Liste Filtreleme
Temiz işlem hatları için liste öğelerini yüklem işlevleriyle filtreleyin.
keep(), discard() ve Liste Filtreleme, CoddyKit'te ücretsiz bir R Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, R Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. R Academy kursu toplamda 4 dersten oluşur.
purrr ile Listeleri Filtreleme
purrr, listeleri yüklemlere göre filtrelemek, aramak ve sınamak için bir işlev ailesi sunar. Yüklem, TRUE veya FALSE döndüren bir işlevdir. Bu işlevler, ayrıntılı Filter() çağrılarının ve koşullu döngülerin yerini alır.
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() — Bir Yüklemle Eşleşen Öğeleri Koruma
keep(.x, .p), yalnızca .p yükleminin TRUE döndürdüğü .x öğelerini korur. discard() işlevinin tersidir. Yüklem bir işlev adı, formül veya mantıksal vektör olabilir.
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() — Bir Yüklemle Eşleşen Öğeleri Kaldırma
discard(.x, .p), yüklemin TRUE döndürdüğü öğeleri kaldırır ve geri kalanları korur. keep() işlevinin karşılığıdır. Bir listeden null değerleri, NA değerlerini veya istenmeyen türleri filtrelemek için kullanın.
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() — NULL Öğelerini Kaldırma
compact(.x), listedeki tüm NULL öğelerini kaldırır; discard(.x, is.null) ifadesine denktir, ancak daha kısadır. Bazı girdiler için NULL döndürebilecek map() çağrılarından sonra özellikle kullanışlıdır.
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() — İlk Eşleşmeyi Bulma
detect(.x, .p), yüklemi karşılayan ilk öğeyi döndürür. Hiçbir öğe eşleşmezse NULL döndürür. Sağdan arama yapmak ve son eşleşmeyi bulmak için detect(.right=TRUE) kullanın.
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() — İlk Eşleşmenin Konumunu Bulma
detect_index(.x, .p), yüklemi karşılayan ilk öğenin dizinini döndürür (eşleşme bulunamazsa 0L). Değere değil konuma ihtiyaç duyduğunuzda, örneğin ilgili öğeyi güncellemek veya almak istediğinizde kullanışlıdır.
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() — Tüm Öğeler Eşleşiyor mu?
every(.x, .p), yüklem her öğe için karşılanıyorsa TRUE döndürür. İlk FALSE değerinde işlemi kısa devreyle sonlandırır. Tembel değerlendirme yapılması dışında all(map_lgl(.x, .p)) ifadesine denktir.
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() — Herhangi Bir Öğe Eşleşiyor mu?
some(.x, .p), en az bir öğe yüklemi karşılıyorsa TRUE döndürür. İlk TRUE değerinde işlemi kısa devreyle sonlandırır. Tembel değerlendirme yapılması dışında any(map_lgl(.x, .p)) ifadesine denktir.
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() — Hiçbir Öğe Eşleşmiyor mu?
none(.x, .p), yüklemi karşılayan hiçbir öğe yoksa TRUE döndürür. !some(.x, .p) ifadesine denktir; ancak bir koşulun bulunmadığını doğrulamak istediğiniz doğrulama bağlamlarında daha anlaşılırdır.
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)keep() ile map() işlevlerini birleştirme
keep() (veya discard()) işlevini map() ile zincirlemek yaygın bir örüntüdür: önce listeyi ilgili öğeleri içerecek şekilde filtreler, ardından bir dönüşüm uygularsınız. Böylece filtreleme mantığı ile işleme mantığı birbirinden temiz bir şekilde ayrılır.
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)keep() ile is.* İşlevlerini Kullanma
R'nin yerleşik is.* koşul işlevleri (is.numeric, is.character, is.null, is.na, is.finite), ~ ile sarmalanmaları gerekmeden keep() ve discard() içinde doğrudan koşul olarak kullanılabilir.
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))Kısa Kontrol
.x içindeki hiçbir öğe .p koşulunu sağlamadığında detect(.x, .p) ne döndürür?
Özet: Liste Filtreleme İşlevleri
purrr'ın liste filtreleme araçlarıyla ilgili temel noktalar:
keep(.x, .p)— koşulun TRUE olduğu öğeleri tutardiscard(.x, .p)— koşulun TRUE olduğu öğeleri kaldırırcompact(.x)— tüm NULL öğelerini kaldırırdetect(.x, .p)— koşulla eşleşen ilk öğeyi döndürür (veya NULL)detect_index(.x, .p)— ilk eşleşmenin dizinini döndürür (veya 0L)every(.x, .p)— tüm öğeler eşleşiyorsa TRUE döndürürsome(.x, .p)— herhangi bir öğe eşleşiyorsa TRUE döndürürnone(.x, .p)— hiçbir öğe eşleşmiyorsa TRUE döndürür
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))Sıkça Sorulan Sorular
“keep(), discard() ve Liste Filtreleme” dersi ücretsiz mi?
Evet — “keep(), discard() ve Liste Filtreleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve R Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. R Academy kursu toplamda 4 dersten oluşur.
“keep(), discard() ve Liste Filtreleme” dersinde ne öğreneceğim?
Temiz işlem hatları için liste öğelerini yüklem işlevleriyle filtreleyin. R Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
R Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te R Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“keep(), discard() ve Liste Filtreleme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu R Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her R Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- map() ve Türlendirilmiş Çeşitleri
- Birden Fazla Girdi için map2() ve pmap()
- reduce(), accumulate() ve walk()
- keep(), discard() ve Liste Filtreleme