stop() ve warning() ile Sağlam İşlevler Yazma
Kendi işlevlerinizin içinden özel koşulları bildirin.
stop() ve warning() ile Sağlam İşlevler Yazma, 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.
Girdi Doğrulama Neden Önemlidir
Savunmacı işlevler girdilerini denetler ve yanlış sonuçlar üretmek yerine bilgilendirici hatalarla açıkça başarısız olur. Hatalı girdiyi sınırda yakalayan bir işlevde hata ayıklamak, anlamsız verileri bir işlem hattı boyunca yayan bir işlevde hata ayıklamaktan çok daha kolaydır.
# Without validation: wrong result, no error
bad_mean <- function(x) sum(x) / length(x)
bad_mean('hello') # no error, just NA
# With validation: clear error
good_mean <- function(x) {
if (!is.numeric(x)) stop('x must be numeric')
sum(x) / length(x)
}
tryCatch(good_mean('hello'), error = function(e) cat(e$message, '\n'))Bilgilendirici Hata Mesajları
stop('bad input') gibi genel hatalarda hata ayıklamak zordur. Mesaja gerçek değeri ve beklenen türü eklemek için stop() içinde paste0() veya sprintf() kullanın. Bu, işlem hatalarındaki hataları izlerken zaman kazandırır.
check_numeric <- function(x, arg_name = 'x') {
if (!is.numeric(x)) {
stop(sprintf(
"'%s' must be numeric, but got class '%s'",
arg_name, class(x)
))
}
}
tryCatch(check_numeric('abc', 'score'),
error = function(e) cat(e$message, '\n'))Uzunluk ve Aralık Doğrulama
Yaygın doğrulamalar şunlardır: bir vektörün boş olmadığını (length(x) == 0), bir skalerin aralık içinde olduğunu veya bir veri çerçevesinin beklenen sütunlara sahip olduğunu denetlemek. Her denetimin kendine özgü, uygun bir hata mesajı olmalıdır.
validate_prob <- function(p) {
if (!is.numeric(p)) stop(paste0('p must be numeric, got: ', class(p)))
if (length(p) != 1) stop(paste0('p must be length 1, got: ', length(p)))
if (p < 0 || p > 1) stop(paste0('p must be in [0,1], got: ', p))
p
}
cat(validate_prob(0.7), '\n')
tryCatch(validate_prob(1.5), error = function(e) cat(e$message, '\n'))Ölümcül Olmayan Sorunlar İçin warning() Kullanımı
İşlev makul bir sonuç döndürmeye devam edebiliyor ancak çağıranın olağandışı bir durumdan haberdar olması gerekiyorsa warning() kullanın. Buna bir değeri dönüştürmek, varsayılan bir değer atamak veya sınırda bir girdi algılamak örnek verilebilir.
clamp <- function(x, lo, hi) {
if (any(x < lo)) warning(paste0(sum(x < lo), ' value(s) below lo, clamped'))
if (any(x > hi)) warning(paste0(sum(x > hi), ' value(s) above hi, clamped'))
pmax(lo, pmin(hi, x))
}
result <- clamp(c(2, -5, 7, 100, 4), 0, 10)
cat('Result:', result, '\n')stop() İçinde call. = FALSE
Varsayılan olarak stop(), mesaja Error in funcname(...): ön ekini ekler. Çağrı bağlamı açık olduğunda veya işlev kullanıcıya yönelik bir yardımcı işlev olduğunda bu ön eki bastırmak için call. = FALSE aktarın.
# With call. = TRUE (default): shows calling function
f1 <- function(x) stop('bad input')
tryCatch(f1(1), error = function(e) cat(conditionMessage(e), '\n'))
# With call. = FALSE: cleaner message
f2 <- function(x) stop('bad input', call. = FALSE)
tryCatch(f2(1), error = function(e) cat(conditionMessage(e), '\n'))stop() İçin Özel Koşul Sınıfları
Çağıranların tüm hataları yakalamadan yalnızca işlevinizin hatalarını yakalayabilmesi için structure() kullanarak özel bir hata sınıfı oluşturun. Paket düzeyinde hata yazmanın profesyonel yolu budur.
value_error <- function(msg, call = sys.call(-1)) {
structure(
class = c('value_error', 'error', 'condition'),
list(message = msg, call = call)
)
}
check_positive <- function(x) {
if (x <= 0) stop(value_error(paste0('Expected positive, got: ', x)))
x
}
tryCatch(check_positive(-3),
value_error = function(e) cat('ValueError:', e$message, '\n'),
error = function(e) cat('Other error:', e$message, '\n'))Veri Çerçevesi Sütunlarını Denetleme
Bir işlev veri çerçevesi beklediğinde, sütunları kullanmadan önce gerekli sütunların bulunduğunu doğrulayın. Sütun adlarını denetlemek için %in%, eksik sütunları bildirmek için setdiff() kullanın.
require_cols <- function(df, cols) {
missing <- setdiff(cols, names(df))
if (length(missing) > 0) {
stop(paste0('Missing columns: ', paste(missing, collapse = ', ')))
}
invisible(df)
}
df <- data.frame(x = 1:3, y = 4:6)
tryCatch(
require_cols(df, c('x', 'z', 'w')),
error = function(e) cat(e$message, '\n')
)Kısa İddialar İçin stopifnot()
stopifnot(condition1, condition2, ...), herhangi bir koşul FALSE olduğunda hata fırlatır. Ayrı if (!...) stop(...) blokları yazmadan, bir işlevin başında ön koşulları belirtmenin kısa bir yoludur.
compute_area <- function(width, height) {
stopifnot(
is.numeric(width),
is.numeric(height),
width > 0,
height > 0
)
width * height
}
cat(compute_area(5, 3), '\n')
tryCatch(compute_area(-1, 3), error = function(e) cat(e$message, '\n'))Daha İyi Mesajlar İçin Adlandırılmış stopifnot()
R 4.0 ve sonraki sürümlerde, stopifnot() içindeki adlandırılmış ifadeler otomatik oluşturulan mesajın yerine özel açıklamanızı koyar. Bilgilendirici başarısızlık mesajları üretmek için ifade metnini ad olarak kullanın.
validate_age <- function(age) {
stopifnot(
'age must be numeric' = is.numeric(age),
'age must be positive' = age > 0,
'age must be under 150' = age < 150
)
invisible(age)
}
tryCatch(validate_age(-5), error = function(e) cat(e$message, '\n'))
tryCatch(validate_age('x'), error = function(e) cat(e$message, '\n'))Doğrulama ve İş Mantığını Birleştirme
İyi yapılandırılmış bir işlev, doğrulamayı mantıktan ayırır. Önce doğrulama yapın, ardından işlemi gerçekleştirin. Bu, işlevin okunmasını kolaylaştırır ve hataların herhangi bir hesaplama başlamadan önce algılanmasını sağlar.
discount_price <- function(price, pct) {
if (!is.numeric(price) || price <= 0)
stop(paste0('price must be positive numeric, got: ', price))
if (!is.numeric(pct) || pct < 0 || pct > 100)
stop(paste0('pct must be in [0,100], got: ', pct))
if (pct > 50) warning('discount > 50% is unusual')
price * (1 - pct / 100)
}
cat(discount_price(100, 20), '\n')
cat(suppressWarnings(discount_price(100, 60)), '\n')Yardımcı İşlevlerin İçinde tryCatch
Bazen bir yardımcı işlev hataları kendi içinde ele almalı ve hataları yaymak yerine bir geri dönüş değeri döndürmelidir. Temel mantığı tryCatch() içine alın ve başarısızlık durumunda NA veya NULL gibi üzerinde anlaşılmış bir belirteç döndürün.
safe_log <- function(x) {
tryCatch({
if (!is.numeric(x)) stop('not numeric')
if (x <= 0) stop('must be positive')
log(x)
}, error = function(e) {
warning(paste0('safe_log failed for x=', x, ': ', e$message))
NA_real_
})
}
results <- sapply(list(10, -1, 'a', 100), safe_log)
cat(results, '\n')Hızlı Kontrol
stop() işlevine aktarıldığında call. = FALSE ne yapar?
Sağlam İşlevler: Önemli Noktalar
Sağlam işlevler yazmak için önemli noktalar:
- Girdileri başta doğrulayın; bilgilendirici
stop()mesajlarıyla açıkça başarısız olun - Hata mesajlarına gerçek değeri ekleyin:
paste0('Expected numeric, got: ', class(x)) - Hesaplama devam edebiliyorsa ölümcül olmayan sorunlar için
warning()kullanın call. = FALSE, hata mesajlarındaki çağıran işlev ön ekini bastırır- Kısa iddialar için
stopifnot(), özel mesajlar için adlandırılmış biçim (R 4.0+) - Özel koşul sınıfları, çağıranların seçerek yakalama yapmasını sağlar
robust_divide <- function(x, y) {
stopifnot('x must be numeric' = is.numeric(x),
'y must be numeric' = is.numeric(y))
if (y == 0) stop('Division by zero', call. = FALSE)
if (abs(y) < 1e-10) warning('y is very small; result may be inaccurate')
x / y
}
cat(robust_divide(10, 2), '\n')
tryCatch(robust_divide(10, 0), error = function(e) cat(e$message, '\n'))Yapay zeka eğitmeniyle R öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 43
- Dersler
- 159
Sıkça Sorulan Sorular
“stop() ve warning() ile Sağlam İşlevler Yazma” dersi ücretsiz mi?
Evet — “stop() ve warning() ile Sağlam İşlevler Yazma” 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.
“stop() ve warning() ile Sağlam İşlevler Yazma” dersinde ne öğreneceğim?
Kendi işlevlerinizin içinden özel koşulları bildirin. 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.
“stop() ve warning() ile Sağlam İşlevler Yazma” 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
- R'de Hatalar, Uyarılar ve İletiler
- Hata Kurtarma için tryCatch()
- withCallingHandlers() ve Yeniden Başlatmalar
- stop() ve warning() ile Sağlam İşlevler Yazma