Ad un certo punto, glm.fit
viene chiamato. Ciò significa una delle funzioni si chiama o una delle funzioni chiamate da quelle funzioni è utilizzando glm
, glm.fit
.
Inoltre, come ho detto nel mio commento sopra, questo è un avvertimento, non un errore , il che fa una grande differenza. Non puoi attivare nessuno degli strumenti di debug di R da un avviso (con le opzioni predefinite prima che qualcuno mi dica che ho torto ;-).
Se cambiamo le opzioni per trasformare gli avvisi in errori, possiamo iniziare a utilizzare gli strumenti di debug di R. Da ?options
noi abbiamo:
‘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.
Quindi se corri
options(warn = 2)
quindi esegui il tuo codice, R genererà un errore. A quel punto potresti correre
traceback()
per vedere lo stack di chiamate. Ecco un esempio.
> 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)
Qui puoi ignorare i frame contrassegnati 4:
e superiori. Vediamo che è stato foo
chiamato bar
e che ha bar
generato l'avviso. Questo dovrebbe mostrarti quali funzioni stavano chiamando glm.fit
.
Se ora vuoi eseguire il debug di questo, possiamo passare a un'altra opzione per dire a R di entrare nel debugger quando incontra un errore, e poiché abbiamo commesso errori di avviso, otterremo un debugger quando viene attivato l'avviso originale. Per questo dovresti eseguire:
options(error = recover)
Ecco un esempio:
> 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:
Puoi quindi entrare in uno di questi frame per vedere cosa stava succedendo quando è stato lanciato l'avviso.
Per ripristinare le opzioni precedenti ai valori predefiniti, immettere
options(error = NULL, warn = 0)
Per quanto riguarda l'avviso specifico che citi, è molto probabile che tu debba consentire più iterazioni nel codice. Una volta che hai scoperto cosa sta chiamando glm.fit
, scopri come passargli l' control
argomento usandoglm.control
- vedi ?glm.control
.