Отладка универсальных функций в R - PullRequest
11 голосов
/ 10 ноября 2009

Как вы отлаживаете универсальную функцию (используя debug или mtrace в пакете отладки)?

В качестве примера я хочу отладить cenreg в пакете NADA, а именно метод, который принимает входные данные формулы.

Вы можете получить подробную информацию о методе следующим образом:

library(NADA)
getMethod("cenreg", c("formula", "missing", "missing"))

function (obs, censored, groups, ...) 
{
    .local <- function (obs, censored, groups, dist, conf.int = 0.95, 
        ...) 
    {
        dist = ifelse(missing(dist), "lognormal", dist)

...
}

Проблема в том, что сам Cenreg выглядит так:

body(cenreg)
# standardGeneric("cenreg")

Я не знаю, как выполнить базовый метод, а не универсальную оболочку.

1 Ответ

14 голосов
/ 10 ноября 2009

Мои первые два предложения довольно просты: (1) заключить вызов функции в try() (который часто предоставляет больше информации о классах S4) и (2) вызвать traceback() после того, как выдается ошибка (которая иногда дать подсказки, где проблема действительно происходит).

Вызов debug() не поможет в этом сценарии, поэтому вам нужно использовать trace или browser. Со страницы справки по отладке:

"In order to debug S4 methods (see Methods), you need to use trace, typically 
calling browser, e.g., as "
  trace("plot", browser, exit=browser, signature = c("track", "missing")) 

С классами S4 может быть сложно работать; одним из примеров этого является комментарий в документации debug package (касающийся использования mtrace() с классами S4):

"I have no plans to write S4 methods, and hope not to have to
debug other people’s!"

A похожий вопрос был задан недавно в R-Help . Рекомендация Дункана Мердока:

"You can insert a call to browser() if you want to modify the source.  If
you'd rather not do that, you can use trace() to set a breakpoint in it.
The new setBreakpoint() function in R 2.10.0 will also work, if you
install the package from source with the R_KEEP_PKG_SOURCE=yes
environment variable set.  It allows you to set a breakpoint at a
particular line number in the source code."

Я никогда не делал этого раньше себя (и это требует R 2.10.0), но вы можете попробовать установить из источника с R_KEEP_PKG_SOURCE=yes.

Кстати, вы можете использовать CRAN зеркало NADA в github для просмотра источника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...