كيف تخبر Lapply بتجاهل خطأ ومعالجة الشيء التالي في القائمة؟

StackOverflow https://stackoverflow.com/questions/2589275

سؤال

لدي وظيفة مثال أدناه تقرأ في تاريخ كسلسلة وإرجاعها ككائن تاريخ. إذا قرأت سلسلة لا يمكن تحويلها إلى تاريخ ، فإنها تُرجع خطأ.

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"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top