2016-01-13 14 views
5

Kiedy używam plyr i dplyr do analizy dużego zestawu danych pogrupowanego według identyfikatora, czasami pojawia się błąd w mojej funkcji. Mogę użyć przeglądarki() lub debuggera(), aby sprawdzić, co się dzieje, ale jedną kwestią jest to, że nie wiem, czy problem dotyczy pierwszego identyfikatora, czy setnego. Mogę użyć debuggera, aby pozwolić mi zatrzymać się na tym błędzie, ale czy istnieje łatwy sposób sprawdzenia, jaki identyfikator spowodował problem, oprócz włączenia samego identyfikatora jako wejścia funkcji wyłącznie w celu debugowania? Ilustruje poniższy przykład.Debugowanie w plyr lub dplyr - zobacz, która grupa

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

Oczywiście to powoduje błąd poniżej i kiedy nurkowania w wysypisko, muszę tylko wskazówkę, gdzie szukać (patrz niżej)

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

Zresztą, może właśnie w tym id jako wprowadzenie za każdym razem do łatwego debugowania jest po prostu drogą do zrobienia, ale zastanawiałem się, czy było coś bardziej eleganckiego niż profesjonaliści, bez potrzeby przekazywania dodatkowych zmiennych.

Andy

Odpowiedz

4

biegnę do tego cały czas z dplyr za group_by() miałem kłopot z użyciem mojego zwykłego options(error=recover).

Odkryłam, że owijanie funkcję przestępstwa w tryCatch() załatwia sprawę:

> dsumm = ddply(d,"id",summarise,mean=tryCatch(meanerr(y),error=function(e){"error"})) 
> dsumm 
    id mean 
1 1 2.5 
2 2 error 
Powiązane problemy