2016-01-13 7 views
5

देख रहा है जब मैं एक आईडी द्वारा समूहीकृत एक बड़े डेटासेट का विश्लेषण करने के लिए प्लीयर और dplyr का उपयोग कर रहा हूं, तो मुझे कभी-कभी मेरे फ़ंक्शन में कोई त्रुटि मिलती है। मैं क्या चल रहा है यह जानने के लिए ब्राउज़र() या डीबगर() का उपयोग कर सकता हूं, लेकिन एक मुद्दा यह है कि मुझे नहीं पता कि समस्या पहली आईडी या 100 वें के साथ है या नहीं। मैं त्रुटि पर रुकने के लिए डीबगर का उपयोग कर सकता हूं, लेकिन क्या यह देखने का एक आसान तरीका है कि आईडी ने समस्या को उत्पन्न करने के अलावा आईडी को डीबगिंग के एकमात्र उद्देश्य के लिए फ़ंक्शन इनपुट के रूप में शामिल किया है? मैं नीचे दिए गए उदाहरण के साथ चित्रित करता हूं।प्लीयर या dplyr में डिबगिंग - कौन सा समूह

meanerr = function(y) { 
    m = mean(y) 
    stopifnot(!is.na(m)) 
    return(m) 
} 

d = data.frame(id=c(1,1,1,1,2,2),y=c(1,2,3,4,5,NA)) 
dsumm = ddply(d,"id",summarise,mean=meanerr(y)) 

बेशक यह नीचे त्रुटि का कारण बनता है और जब मैं डंप में गोता लगाने, मैं सिर्फ सुराग देखने के लिए जहां के लिए है (नीचे देखें)

> options(error=dump.frames) 
> source('~/svn/pgm/test_debug_ddply.R') 
Error: !is.na(m) is not TRUE 
> debugger() 
Message: Error: !is.na(m) is not TRUE 
Available environments had calls: 
1: source("~/svn/pgm/test_debug_ddply.R") 
2: withVisible(eval(ei, envir)) 
3: eval(ei, envir) 
4: eval(expr, envir, enclos) 
5: test_debug_ddply.R#9: ddply(d, "id", summarise, mean = meanerr(y)) 
6: ldply(.data = pieces, .fun = .fun, ..., .progress = .progress, .inform = .inform, .parallel = . 
7: llply(.data = .data, .fun = .fun, ..., .progress = .progress, .inform = .inform, .parallel = .p 
8: loop_apply(n, do.ply) 
9: (function (i) 
{ 
    piece <- pieces[[i]] 
    if (.inform) { 
     res <- try(.fun(piece, ...)) 

10: .fun(piece, ...) 
11: eval(cols[[col]], .data, parent.frame()) 
12: eval(expr, envir, enclos) 
13: meanerr(y) 
14: test_debug_ddply.R#3: stopifnot(!is.na(m)) 
15: stop(sprintf(ngettext(length(r), "%s is not TRUE", "%s are not all TRUE"), ch), call. = FALSE, 

वैसे भी, शायद सिर्फ एक के रूप में आईडी सहित आसान डिबगिंग के लिए प्रत्येक बार इनपुट केवल जाने का तरीका है, लेकिन मैं सोच रहा था कि क्या कुछ और सुरुचिपूर्ण था कि पेशेवर अतिरिक्त चर के पारित होने की आवश्यकता के बिना उपयोग करते हैं।

एंडी

उत्तर

4

मैं इस में मेरी हमेशा की तरह options(error=recover) का उपयोग कर dplyr के group_by() मैं मिला है मुसीबत के साथ हर समय चलाते हैं।

मैंने पाया कि एक tryCatch() में अपमानजनक समारोह लपेटकर काम कर देता है:

> dsumm = ddply(d,"id",summarise,mean=tryCatch(meanerr(y),error=function(e){"error"})) 
> dsumm 
    id mean 
1 1 2.5 
2 2 error 
संबंधित मुद्दे