Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

التحذيرات وfinally

جزء من قسم المنطق وتدفق التنفيذ في رحلة R على Coddy. الدرس 54 من 64.

يُبلّغ التحذير عن مشكلة دون إيقاف التنفيذ: تُرجع الدالة قيمةً، وتطبع R التحذير في النهاية. تُصدر as.numeric() تحذيرًا للنص الذي ليس رقمًا، وتُرجع NA:

x <- as.numeric("abc")
print(x)

الناتج:

[1] NA
Warning message:
NAs introduced by coercion 

مثل الأخطاء، تذهب التحذيرات إلى تدفق الأخطاء، لذا فهي تؤدي إلى فشل اختبار على Coddy. تعمل suppressWarnings() على إسكاتها عندما تتحقق من النتيجة بنفسك، بينما تحوّل tryCatch(..., warning = ) التحذير إلى قيمة:

x <- suppressWarnings(as.numeric("abc"))
print(is.na(x))
r <- tryCatch(as.numeric("abc"), warning = function(w) paste("warned:", conditionMessage(w)))
print(r)

الناتج:

[1] TRUE
[1] "warned: NAs introduced by coercion"

warning("message") يطلق تحذيرًا من التعليمات البرمجية الخاصة بك. ويعمل معالج التحذير بالطريقة نفسها التي يعمل بها معالج الخطأ:

ratio <- function(a, b) {
  if (b == 0) warning("b is zero, returning Inf")
  a / b
}
r <- tryCatch(ratio(1, 0), warning = function(w) conditionMessage(w))
print(r)

المخرجات:

[1] "b is zero, returning Inf"

يتم تشغيل finally = ... بعد التعبير وأي معالج، سواء حدث خطأ أم لا. استخدمه لتنفيذ العمل الذي يجب أن يحدث دائمًا، مثل رسالة ختامية:

load <- function(x) {
  tryCatch({
    if (x < 0) stop("negative")
    x * 10
  }, error = function(e) NA,
  finally = cat("finished", x, "\n"))
}
print(load(2))
print(load(-1))

المخرجات:

finished 2 
[1] 20
finished -1 
[1] NA
challenge icon

التحدي

سهل

أكمل to_numbers(texts). حوّل كل نص إلى رقم. تصبح القيم التي يتعذر تحويلها NA من دون طباعة أي تحذير. أعد سطرين: Numbers: مع الأرقام المحوّلة مفصولة بمسافات (بما في ذلك قيم NA)، وInvalid: مع عدد القيم التي فشلت.

يقرأ الكود المزوّد النصوص كسطر مفصول بفواصل ويطبع كل سطر مُعاد.

جرّب بنفسك

to_numbers <- function(texts) {
  # اكتب الكود الخاص بك هنا
  c("Numbers: ", "Invalid: 0")
}

# كود الإدخال/الإخراج المُزوَّد: أبقه كما هو
input <- suppressWarnings(readLines(file("stdin")))
cat(to_numbers(strsplit(input[1], ",")[[1]]), sep = "\n")
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق وتدفق التنفيذ

تدرّب بنفسك: مترجم R عبر الإنترنت