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

التحقق من صحة الإدخال

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

المدخلات من المستخدمين أو الملفات هي نصوص ويمكن أن تكون أي شيء. تحقّق منها قبل استخدامها: تعطي suppressWarnings(as.numeric(s)) القيمة NA للنص الذي ليس رقمًا، وتختبر is.na() ذلك:

read_age <- function(s) {
  n <- suppressWarnings(as.numeric(s))
  if (is.na(n)) return("not a number")
  if (n < 0 || n > 130) return("out of range")
  paste("age", n)
}
print(read_age("36"))
print(read_age("abc"))
print(read_age("200"))

المخرجات:

[1] "age 36"
[1] "not a number"
[1] "out of range"

يمكن لأداة التحقق جمع كل مشكلة بدلًا من التوقف عند أول مشكلة، مما يوفر ملاحظات أكثر فائدة. فهي تُرجع هنا متجهًا من الرسائل، ويكون فارغًا عندما يكون الإدخال سليمًا:

check_password <- function(p) {
  problems <- c()
  if (nchar(p) < 8) problems <- c(problems, "too short")
  if (!grepl("[0-9]", p)) problems <- c(problems, "needs a digit")
  problems
}
print(check_password("abc"))
print(length(check_password("secret123")))

الناتج:

[1] "too short"     "needs a digit"
[1] 0

اختر الأسلوب بناءً على من يستدعي الدالة: أعد رسالة عندما يتوقع المستدعي إدخالًا غير صالح ويعرضها على مستخدم؛ وارفع خطأً باستخدام stop() عندما يعني الإدخال غير الصالح وجود خطأ في البرنامج لا ينبغي أن يمر دون ملاحظة.

# المتصل يتوقع إدخالاً سيئاً ويعرض الرسالة
read_age("abc")                     # "not a number"
# الإدخال السيء هو خطأ في البرنامج
if (!is.numeric(x)) stop("x must be numeric")

يؤدي استخدام tryCatch() حول خطوة التحليل إلى إبقاء الشيفرة الرئيسية خالية من عمليات التحقق: إذ يُحوَّل كل سجل أو يُبلَّغ عنه:

parse_record <- function(line) {
  parts <- strsplit(line, ",")[[1]]
  if (length(parts) != 2) stop("expected 2 fields")
  qty <- suppressWarnings(as.integer(parts[2]))
  if (is.na(qty)) stop("quantity is not a whole number")
  list(item = parts[1], qty = qty)
}
for (line in c("tea,2", "jam", "oil,x")) {
  r <- tryCatch(parse_record(line), error = function(e) conditionMessage(e))
  cat(line, ":", if (is.list(r)) paste("ok", r$qty) else r, "\n")
}

الناتج:

tea,2 : ok 2 
jam : expected 2 fields 
oil,x : quantity is not a whole number 
challenge icon

التحدي

سهل

أكمل check_signup(name, age, email). اجمع كل مشكلة، بهذا الترتيب: name is empty (بعد إزالة المسافات من الطرفين)، age must be a number، age must be 13 or older (فقط عندما يكون العمر رقمًا)، وemail needs @. أعد ok عندما لا توجد أي مشكلة، وإلا فأعد المشكلات مفصولة بـ ; .

يقرأ الكود المزوَّد الاسم والعمر والبريد الإلكتروني (واحدًا في كل سطر) ويطبع القيمة المُعادة.

جرّب بنفسك

check_signup <- function(name, age, email) {
  # اكتب الكود الخاص بك هنا
  "ok"
}

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

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

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

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