2011-03-07 12 views
5

का मानना ​​है कि मेरे पास दो आर फ़ाइलें हैं: correct.R और broken.R। त्रुटियों की जांच के लिए tryCatch का उपयोग करने का सबसे अच्छा तरीका क्या होगा?tryCatch और स्रोत

वर्तमान में, मैं

> x = tryCatch(source("broken.R"), error=function(e) e) 
> x 
<simpleError in source("broken.R"): test.R:2:0: unexpected end of input 
    1: x = { 
    ^> 
> y = tryCatch(source("correct.R"), error=function(e) e) 
> y 
$value 
[1] 5 

$visible 
[1] FALSE 

हालांकि, जिस तरह से मैं tryCatch निर्माण किया गया है इसका मतलब है मैं x और y वस्तुओं पूछताछ निर्धारित करने के लिए यदि कोई त्रुटि कर दिया गया है है है।

क्या ऐसा करने का कोई बेहतर तरीका है?


प्रश्न शिक्षण से आता है। 100 छात्र अपनी आर स्क्रिप्ट अपलोड करते हैं और मैं स्क्रिप्ट चलाता हूं। अच्छा होने के लिए, मैं एक साधारण फ़ंक्शन बनाने की योजना बना रहा हूं जो यह निर्धारित करता है कि उनके फ़ंक्शन सही तरीके से स्रोत हैं या नहीं। इसे केवल सत्य या गलत लौटने की जरूरत है।

+0

ध्यान दें कि 'tryCatch' केवल उस पहली त्रुटि की रिपोर्ट करेगा जो इसे टक्कर देता है। – aL3xa

उत्तर

2

शायद मैं इस underthinking कर रहा हूँ, लेकिन आप के बाद से बस, तुम बस $visible के अस्तित्व के लिए परीक्षण कर सकते हैं बूलियन के लिए देख रहे:

y <- tryCatch(source("broken.R"), error=function(e) e) 
works <- !is.null(y$visible) #y$visible would be null if there were an error 

है कि आप जो खोज रहे हैं को हल करता है? आप एक पाश में लपेट कर (या कहें lapply का उपयोग करें) की तरह:

for(i in 1:length(students)) { 
    works[i] <- !is.null(tryCatch(source(student_submissions[i]), error=function(e) e)$visible) 
} 
+0

मैं यही कर रहा हूं, यह सिर्फ घबराहट लग रहा था। मुझे लगता है कि मैं 'is.error' कमांड की तलाश में था। – csgillespie

+3

विरासत का उपयोग करें (x, "try-error") – mdsumner

+0

er, ऑब्जेक्ट्स के साथ कोशिश करने के लिए, tryCatch नहीं है – mdsumner

4

इस प्रयास करें:

> tryCatch(stop("foo"), error = function(e) { 
+ cat(e$message, "\n") 
+ FALSE 
+ }) 
foo 
[1] FALSE 

वैकल्पिक रूप से, आप हैडली के testthat पैकेज पर विचार करना चाहिए:

> expect_that(stop("foo"), is_a("numeric")) 
Error in is.vector(X) : foo 
2

पर विस्तार करने के लिए mdsumner बिंदु, यह एक सरल कार्यान्वयन है।

sources_correctly <- function(file) 
{ 
    fn <- try(source(file)) 
    !inherits((fn, "try-error")) 
} 
संबंधित मुद्दे