Когда я использую plyr и dplyr для анализа большого набора данных, который сгруппирован по id, я иногда получаю ошибку в своей функции. Я могу использовать browser() или debugger() для изучения того, что происходит, но одна проблема заключается в том, что я не знаю, связана ли проблема с первым id или 100-м. Я могу использовать отладчик, чтобы я мог остановиться на ошибке, но есть ли простой способ увидеть, какой идентификатор вызвал проблему, помимо включения идентификатора в качестве функции ввода с единственной целью отладки? Я проиллюстрирую приведенный ниже пример.Отладка в plyr или 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,
Во всяком случае, может быть только в том числе идентификатора работы в качестве вход каждый раз для легкой отладки - это просто путь, но мне было интересно, есть ли что-то более элегантное, что используют профессионалы, не требуя прохождения дополнительных переменных.
Энди