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