withCallingHandlers() ve Yeniden Başlatmalar
Yerel olmayan koşul işleme için withCallingHandlers() kullanın.
withCallingHandlers() ve Yeniden Başlatmalar, CoddyKit'te ücretsiz bir R Academy dersidir. Bu, 4 dersinin 3. 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.
tryCatch ve withCallingHandlers Karşılaştırması
Temel fark şudur: tryCatch() yerel olmayan bir çıkış oluşturur; bir koşul yakalandığında denetim ifadenin dışına aktarılır ve geri dönmez. withCallingHandlers() ise çağrı yığınını korur ve işleme sonrasında yürütmenin devam etmesini sağlayabilir.
# tryCatch: execution does NOT continue after warning
tryCatch({
warning('first')
cat('This line is never reached\n')
}, warning = function(w) cat('tryCatch caught:', w$message, '\n'))withCallingHandlers Yürütmeyi Sürdürür
withCallingHandlers() kullanıldığında işleyici çalışır, ancak koşul bildirildikten sonra yürütme devam eder (işleyicinin kendisi bir hata fırlatmadığı veya bir yeniden başlatma çağırmadığı sürece). Çağrı yığını açılmaz.
withCallingHandlers({
warning('first warning')
cat('Execution continues here\n')
warning('second warning')
cat('And here too\n')
}, warning = function(w) {
cat('Handler saw:', w$message, '\n')
invokeRestart('muffleWarning')
})muffleWarning Yeniden Başlatması
Bir uyarı işleyicisinin içinde invokeRestart('muffleWarning') çağrılması, uyarının R'nin varsayılan işleyicisi tarafından yazdırılmasını engeller. Bu çağrı olmadan, işleyiciniz çalıştıktan sonra R uyarıyı yine varsayılan mekanizmasıyla yazdırır.
# Without muffleWarning: warning still shows after handler
withCallingHandlers({
warning('test')
}, warning = function(w) {
cat('Handler ran\n')
# no muffleWarning: default handler still fires
})muffleMessage Yeniden Başlatması
Benzer şekilde, bir mesaj işleyicisinin içinde invokeRestart('muffleMessage') çağrılması, özel işleyiciniz mesajı işledikten sonra mesajı susturur. suppressMessages() işlevinin temelindeki mekanizma budur.
withCallingHandlers({
message('Progress: 50%')
message('Progress: 100%')
}, message = function(m) {
cat('[LOG]', trimws(m$message), '\n')
invokeRestart('muffleMessage')
})Durdurmadan Uyarıları Günlüğe Kaydetme
withCallingHandlers() için pratik bir kullanım şudur: kodun tamamlanmasına izin verirken uyarıları bir günlük vektöründe toplamak. tryCatch() ilk uyarıda dururdu; withCallingHandlers() ise tüm uyarıları toplar.
warnings_log <- character(0)
result <- withCallingHandlers({
x <- log(-1)
y <- sqrt(-4)
c(x, y)
}, warning = function(w) {
warnings_log <<- c(warnings_log, w$message)
invokeRestart('muffleWarning')
})
cat('Warnings logged:', length(warnings_log), '\n')
cat(warnings_log, sep = '\n')invokeRestart() Kavramı
Yeniden başlatmalar, koşulu bildiren kodun sunabileceği önceden tanımlanmış kurtarma stratejileridir. invokeRestart(name) bu stratejilerden birini seçer. Yerleşik yeniden başlatmalar arasında 'muffleWarning' ve 'muffleMessage' bulunur; withRestarts() ile özel yeniden başlatmalar tanımlayabilirsiniz.
# withRestarts() offers named recovery options
divide_safe <- function(x, y) {
withRestarts(
{
if (y == 0) stop('division by zero')
x / y
},
use_zero = function() 0,
use_na = function() NA
)
}
# A handler can pick a restart
withCallingHandlers(
divide_safe(10, 0),
error = function(e) invokeRestart('use_zero')
)withCallingHandlers ve tryCatch Birlikte Kullanımı
Bu ikisini iç içe yerleştirebilirsiniz: koşulları günlüğe kaydetmek veya saymak için dışta withCallingHandlers(), varsayılan bir değer sağlamak için içte tryCatch() kullanın. Dıştaki işleyici koşulu önce görür.
n_warnings <- 0L
result <- withCallingHandlers(
tryCatch(log(-1), warning = function(w) -999),
warning = function(w) {
n_warnings <<- n_warnings + 1L
cat('Logged warning #', n_warnings, '\n')
}
)
cat('Result:', result, '\n')Özel Koşul Sınıfları
structure() işlevini, c('myError', 'error', 'condition') sınıfına sahip bir liste üzerinde çağırarak özel koşul sınıfları oluşturabilirsiniz. İşleyiciler sınıfa göre eşleşir; bu nedenle özel sınıflar, tüm hataları yakalamadan belirli hata türlerini yakalamanızı sağlar.
my_error <- function(msg, data = NULL) {
structure(
class = c('my_error', 'error', 'condition'),
list(message = msg, data = data)
)
}
tryCatch(
stop(my_error('custom error', data = 42)),
my_error = function(e) cat('Custom handler, data=', e$data, '\n'),
error = function(e) cat('Generic handler\n')
)withCallingHandlers Ne Zaman Kullanılmalı
Yürütmeyi durdurmadan koşulları gözlemlemek veya günlüğe kaydetmek istediğinizde withCallingHandlers() kullanın. Bir koşuldan kurtulup alternatif bir değer döndürmek istediğinizde tryCatch() kullanın. Bu iki işlev farklı sorunları çözer.
# withCallingHandlers: observe all, continue
withCallingHandlers(
for (x in c(4, -1, 9, -4)) cat(suppressWarnings(sqrt(x)), ''),
warning = function(w) cat('[warn]', '')
)
cat('\n')Koşul Bildirim Zinciri
Bir koşul bildirildiğinde R, işleyicileri aramak için çağrı yığınında yukarı doğru ilerler. withCallingHandlers() işleyicileri dinamik bağlamda, yani çağrı yığını korunmuş olarak çalışır. tryCatch() işleyicileri ise yığın açıldıktan sonra çalışır; özgün bağlam artık yoktur.
# Demonstrate: withCallingHandlers handler can see full stack
f <- function() {
withCallingHandlers(
g(),
warning = function(w) {
cat('Caught in f, stack length:', sys.nframe(), '\n')
invokeRestart('muffleWarning')
}
)
}
g <- function() warning('from g')
f()suppressWarnings() Uygulaması
suppressWarnings(expr) esas olarak withCallingHandlers(expr, warning = function(w) invokeRestart('muffleWarning')) biçimindedir. Bunu anlamak, yalnızca belirli uyarı türlerini susturan kendi türevlerinizi oluşturmanızı sağlar.
# Suppress only NaN warnings, not others
suppress_nan_warn <- function(expr) {
withCallingHandlers(expr, warning = function(w) {
if (grepl('NaN', conditionMessage(w)))
invokeRestart('muffleWarning')
})
}
suppress_nan_warn(log(-1)) # NaN warning suppressed
tryCatch(
suppress_nan_warn(warning('other issue')),
warning = function(w) cat('Other warning kept:', w$message, '\n')
)Hızlı Kontrol
withCallingHandlers() ile tryCatch() arasındaki temel fark nedir?
Yeniden Başlatmalar: Önemli Noktalar
withCallingHandlers ve yeniden başlatmalar için önemli noktalar:
withCallingHandlers()= yerel işleyici, çağrı yığını korunur, yürütme devam edebilirtryCatch()= yerel olmayan çıkış, yığın açılır, alternatif değer döndürülebilirinvokeRestart('muffleWarning')uyarının varsayılan olarak yazdırılmasını engellerinvokeRestart('muffleMessage')mesajın varsayılan olarak yazdırılmasını engeller- Durdurmadan tüm koşulları toplamak veya günlüğe kaydetmek için
withCallingHandlers()kullanın - Özel koşul sınıfları, belirli hata türlerinin seçerek yakalanmasını sağlar
log_vec <- character(0)
withCallingHandlers({
message('start')
warning('low memory')
message('end')
}, message = function(m) {
log_vec <<- c(log_vec, paste('MSG:', trimws(m$message)))
invokeRestart('muffleMessage')
}, warning = function(w) {
log_vec <<- c(log_vec, paste('WARN:', w$message))
invokeRestart('muffleWarning')
})
cat(log_vec, sep = '\n')Sıkça Sorulan Sorular
“withCallingHandlers() ve Yeniden Başlatmalar” dersi ücretsiz mi?
Evet — “withCallingHandlers() ve Yeniden Başlatmalar” 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.
“withCallingHandlers() ve Yeniden Başlatmalar” dersinde ne öğreneceğim?
Yerel olmayan koşul işleme için withCallingHandlers() kullanın. 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 3. dersidir.
“withCallingHandlers() ve Yeniden Başlatmalar” 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