W pewnym momencie glm.fit
jest wzywany. Oznacza to, że jedną z funkcji zadzwonić lub jedną z funkcji wywoływanych przez te funkcje korzystają albo glm
, glm.fit
.
Ponadto, jak wspomniałem w moim komentarzu powyżej, jest to ostrzeżenie, a nie błąd , co robi dużą różnicę. Nie możesz wywołać żadnego narzędzia debugowania języka R z ostrzeżenia (z domyślnymi opcjami, zanim ktoś mi powie, że się mylę ;-).
Jeśli zmienimy opcje, aby zamienić ostrzeżenia w błędy, możemy zacząć używać narzędzi do debugowania R. Od ?options
mamy:
‘warn’: sets the handling of warning messages. If ‘warn’ is
negative all warnings are ignored. If ‘warn’ is zero (the
default) warnings are stored until the top-level function
returns. If fewer than 10 warnings were signalled they will
be printed otherwise a message saying how many (max 50) were
signalled. An object called ‘last.warning’ is created and
can be printed through the function ‘warnings’. If ‘warn’ is
one, warnings are printed as they occur. If ‘warn’ is two or
larger all warnings are turned into errors.
Więc jeśli uciekniesz
options(warn = 2)
następnie uruchom kod, R zgłosi błąd. W którym momencie możesz biec
traceback()
aby zobaczyć stos wywołań. Oto przykład.
> options(warn = 2)
> foo <- function(x) bar(x + 2)
> bar <- function(y) warning("don't want to use 'y'!")
> foo(1)
Error in bar(x + 2) : (converted from warning) don't want to use 'y'!
> traceback()
7: doWithOneRestart(return(expr), restart)
6: withOneRestart(expr, restarts[[1L]])
5: withRestarts({
.Internal(.signalCondition(simpleWarning(msg, call), msg,
call))
.Internal(.dfltWarn(msg, call))
}, muffleWarning = function() NULL)
4: .signalSimpleWarning("don't want to use 'y'!", quote(bar(x +
2)))
3: warning("don't want to use 'y'!")
2: bar(x + 2)
1: foo(1)
Tutaj możesz zignorować ramki oznaczone 4:
i wyższe. Widzimy, że foo
nazywa bar
, a bar
generowane ostrzeżenie. To powinno pokazać, które funkcje wywoływały glm.fit
.
Jeśli teraz chcesz to debugować, możemy skorzystać z innej opcji, aby powiedzieć R, aby wszedł do debugera, gdy napotka błąd, a ponieważ popełniliśmy błędy ostrzeżeń, po uruchomieniu oryginalnego ostrzeżenia otrzymamy debuger. W tym celu powinieneś uruchomić:
options(error = recover)
Oto przykład:
> options(error = recover)
> foo(1)
Error in bar(x + 2) : (converted from warning) don't want to use 'y'!
Enter a frame number, or 0 to exit
1: foo(1)
2: bar(x + 2)
3: warning("don't want to use 'y'!")
4: .signalSimpleWarning("don't want to use 'y'!", quote(bar(x + 2)))
5: withRestarts({
6: withOneRestart(expr, restarts[[1]])
7: doWithOneRestart(return(expr), restart)
Selection:
Następnie możesz wejść do dowolnej z tych ramek, aby zobaczyć, co się działo, gdy wyświetlono ostrzeżenie.
Aby zresetować powyższe opcje do wartości domyślnych, wprowadź
options(error = NULL, warn = 0)
Jeśli chodzi o konkretne ostrzeżenie, które cytujesz, jest wysoce prawdopodobne, że musisz zezwolić na więcej iteracji w kodzie. Kiedy już dowiesz się, co wywołuje glm.fit
, zastanów się, jak przekazać control
argument, używając glm.control
- patrz ?glm.control
.