سؤال
كيف يمكن للمرء "رمي" خطأ في ص؟ لدي وظيفة تأخذ إطار بيانات وبعض أسماء الأعمدة وتفعل الأشياء معهم. إذا لم تكن الأعمدة موجودة ، فأريد أن تتوقف الوظيفة وتوقف جميع الوظائف حسبها.
لقد نظرت إلى recover
و browse
و traceback
لكن ، حسنًا ، بدا أنهم قريبون ولكن ليس ما أبحث عنه.
المحلول
نرى help(tryCatch)
:
يتم الإشارة إلى الظروف بواسطة '
signalCondition
'. بالإضافة إلى ذلك ،
'stop
' و 'warning
تم تعديل الوظائف لقبولها أيضًا
حجج الحالة.
وبعد ذلك تحت "انظر أيضا":
'
stop
' و 'warning
"ظروف الإشارة ، و"try
"هو في الأساس نسخة مبسطة من"tryCatch
'.
لذلك ربما تريد stop
.
نصائح أخرى
مثال بسيط:
f <- function(a, b){
if (a == 0){
stop("error message")
}
}
ما وراء الوظائف الأساسية التي يذكرها ديرك:
ال حزمة R.OO لديه وظائف معالجة استثناء إضافية ، بما في ذلك وظيفة رمي () وهي مفيدة للغاية. يمكنك التقاط استثناءات مع وظائف المحاولة المعتادة أو Trycatch:
> try(throw("Division by zero.")); print("It's ok!");
Error: [2009-10-22 10:24:07] Exception: Division by zero.
[1] "It's ok!"
يمكنك قراءة المزيد عنه هنا: http://www1.maths.lth.se/help/r/r.oo/
في الواقع الوظيفة stopifnot
مريح للغاية لتنفيذ عمليات فحص العقلانية في الكود الخاص بك. يتطلب الأمر العديد من التعبيرات المنطقية ويعيد خطأً إذا قام أي منها بتقييم كاذب.
مثال: للتحقق مما إذا كان العمود "C" موجود في DataFrame "df":
df <- data.frame(a = numeric(), b = numeric())
stopifnot(!is.null(df$c))
هذا سوف يرمي الخطأ التالي:
Error: !is.null(df$c) is not TRUE
يمكنك التحقق مما إذا كان العمود موجودًا وفعل ما تريده.
لنفترض أ data.frame
اسم الشيئ df1
والتحقق إذا كان العمود col1
موجود:
if(! any(grepl('^col1$',colnames(df1)))) stop("nonexistent column")
أو
if(! any(grepl('^col1$',colnames(df1)))) return(-1)
على سبيل المثال