كيف تخبر Lapply بتجاهل خطأ ومعالجة الشيء التالي في القائمة؟
-
25-09-2019 - |
سؤال
لدي وظيفة مثال أدناه تقرأ في تاريخ كسلسلة وإرجاعها ككائن تاريخ. إذا قرأت سلسلة لا يمكن تحويلها إلى تاريخ ، فإنها تُرجع خطأ.
testFunction <- function (date_in) {
return(as.Date(date_in))
}
testFunction("2010-04-06") # this works fine
testFunction("foo") # this returns an error
الآن ، أريد استخدام Lapply وتطبيق هذه الوظيفة على قائمة التواريخ:
dates1 = c("2010-04-06", "2010-04-07", "2010-04-08")
lapply(dates1, testFunction) # this works fine
ولكن إذا كنت أرغب في تطبيق الوظيفة على قائمة عندما تُرجع سلسلة واحدة في منتصف تواريخ جيدة خطأ ، فما هي أفضل طريقة للتعامل مع هذا؟
dates2 = c("2010-04-06", "foo", "2010-04-08")
lapply(dates2, testFunction)
أفترض أنني أريد محاولة التقاط هناك ، لكن هل هناك طريقة لالتقاط الخطأ لسلسلة "Foo" بينما تطلب من Lapply متابعة وقراءة التاريخ الثالث؟
المحلول
إستخدم tryCatch
التعبير حول الوظيفة التي يمكن أن ترمي رسالة الخطأ:
testFunction <- function (date_in) {
return(tryCatch(as.Date(date_in), error=function(e) NULL))
}
الشيء الجميل في tryCatch
الوظيفة هي أنه يمكنك تحديد ما يجب القيام به في حالة وجود خطأ (في هذه الحالة ، العودة NULL
).
> lapply(dates2, testFunction)
[[1]]
[1] "2010-04-06"
[[2]]
NULL
[[3]]
[1] "2010-04-08"
نصائح أخرى
يمكن للمرء أن يحاول الحفاظ على الأمر بسيطًا بدلاً من جعله معقدًا:
- استخدم تحليل التاريخ المتجه
R> as.Date( c("2010-04-06", "foo", "2010-04-08") ) [1] "2010-04-06" NA "2010-04-08"
يمكنك الالتفاف بشكل تافه na.omit()
أو أيا كان من حوله. أو ابحث عن مؤشر NAS واستخراج وفقًا لذلك من المتجه الأولي ، أو استخدم مكمل NAS للعثور على التواريخ المحلية ، أو ، أو. كل شيء هنا بالفعل.
يمكنك جعل الخاص بك
testFunction()
قم بعمل ما. استخدم الاختبار هناك - إذا كان تاريخ (تحليل) العائد هو NA ، افعل شيئًا.أضف
tryCatch()
كتلة أو أtry()
إلى تحليل تاريخك.
كل الأشياء غريبة بعض الشيء حيث تنتقل من بنية بيانات من نوع واحد (متجه chars) إلى شيء آخر ، ولكن لا يمكنك مزج الأنواع بسهولة ما لم تحتفظ بها في أ list
يكتب. لذلك ربما تحتاج إلى إعادة التفكير في هذا.
على افتراض testFunction()
ليست تافهة و/أو لا يمكن للمرء أن يغيرها ، ويمكن لفها في وظيفة خاصة بك ، مع كتلة trycatch (). فمثلا:
> FaultTolerantTestFunction <- function(date_in) {
+ tryCatch({ret <- testFunction(date_in);}, error = function(e) {ret <<- NA});
+ ret
+ }
> FaultTolerantTestFunction('bozo')
[1] NA
> FaultTolerantTestFunction('2010-03-21')
[1] "2010-03-21"