التحقق من صحة الإدخال
جزء من قسم المنطق وتدفق التنفيذ في رحلة 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 التحدي
سهلأكمل 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")
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
1السلاسل النصية بعمق
السلاسل الفرعية باستخدام substr()التنسيق باستخدام sprintf()التقسيم والضمالبحث في السلاسل النصيةاستبدال النصوصمراجعة - منشئ اسم المستخدم4المصفوفات
إنشاء المصفوفاتفهرسة المصفوفاتملخصات الصفوف والأعمدةالحساب على المصفوفاتمراجعة - مخطط المقاعد2استرجاع القيم باستخدام المفاتيح
البحث في المتجهات المُسمّاةالتحقق من المفاتيحإضافة المفاتيح وإزالتهاالتكرار عبر الأسماءمراجعة - مكتب الأسهم8الفرز والتجميع
فرز المتجهاتالفرز حسب مفتاحالتجميع باستخدام split()ملخصات المجموعاتمراجعة - لوحة المتصدرين11معالجة الأخطاء
رفع الأخطاء باستخدام stop()التقاط الأخطاء باستخدام tryCatch()التحذيرات وfinallyالتحقق من صحة الإدخالمراجعة - آلة حاسبة آمنةتدرّب بنفسك: مترجم R عبر الإنترنت