2016-01-13 15 views
5

Bir kimlik tarafından gruplandırılmış büyük bir veri kümesini analiz etmek için plyr ve dplyr kullanırken, bazen işlevimde bir hata alıyorum. Neler olup bittiğini keşfetmek için tarayıcı() veya debugger() kullanabilirim, ancak bir sorun, sorunun ilk kimlikle mi, yoksa 100'le mi ilgili olduğunu bilmem. Hata ayıklayıcısını hatada durmama izin vermek için kullanabilirim, ancak yalnızca kimliğin hata ayıklamanın tek amacı için bir işlev girdisi olarak dahil edilmesinin yanı sıra, hangi kimliğin soruna neden olduğunu görmenin kolay bir yolu var mı? Aşağıdaki örnekle açıklarım. Bu aşağıdaki hatayı neden olur ve Çöpte dalmak zaman, sadece bakmak için ipucu zorunda TabiiPlyr veya dplyr'de hata ayıklama - hangi grubun göründüğünü görme

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)) 

belki sadece bir olarak id dahil

> 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, 

neyse (aşağıya bakınız) Kolay hata ayıklama için her seferinde giriş yapmak sadece bir yoldur, ancak profesyonellerin ekstra değişkenlerin geçişini gerektirmeden daha zarif bir şey olup olmadığını merak ediyordum.

Andy

cevap

4

bu işe dplyr en group_by() yaşadım sorun benim her zamanki options(error=recover) kullanarak her zaman çalıştırın.

Ben tryCatch() kusurlu fonksiyonunu sarma hüner yok olduğunu tespit ettik:

> dsumm = ddply(d,"id",summarise,mean=tryCatch(meanerr(y),error=function(e){"error"})) 
> dsumm 
    id mean 
1 1 2.5 
2 2 error 
İlgili konular