Tại một số điểm, glm.fit
đang được gọi. Điều đó có nghĩa một trong những chức năng bạn gọi điện thoại hoặc một trong những chức năng được gọi bằng những chức năng đang sử dụng một trong hai glm
, glm.fit
.
Ngoài ra, như tôi đã đề cập trong nhận xét của mình ở trên, đó là một cảnh báo không phải là một lỗi , điều này tạo ra sự khác biệt lớn. Bạn không thể kích hoạt bất kỳ công cụ gỡ lỗi nào của R từ một cảnh báo (với các tùy chọn mặc định trước khi ai đó nói với tôi rằng tôi sai ;-).
Nếu chúng ta thay đổi các tùy chọn để biến cảnh báo thành lỗi thì chúng ta có thể bắt đầu sử dụng các công cụ gỡ lỗi của R. Từ ?options
chúng tôi có:
‘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.
Vì vậy, nếu bạn chạy
options(warn = 2)
sau đó chạy mã của bạn, R sẽ báo lỗi. Tại thời điểm đó, bạn có thể chạy
traceback()
để xem ngăn xếp cuộc gọi. Đây là một ví dụ.
> 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)
Ở đây bạn có thể bỏ qua các khung được đánh dấu 4:
và cao hơn. Chúng tôi thấy rằng foo
được gọi bar
và điều đó đã bar
tạo ra cảnh báo. Điều đó sẽ cho bạn thấy những chức năng nào đang gọi glm.fit
.
Nếu bây giờ bạn muốn gỡ lỗi này, chúng tôi có thể chuyển sang tùy chọn khác để yêu cầu R nhập trình gỡ lỗi khi nó gặp lỗi và vì chúng tôi đã thực hiện các lỗi cảnh báo, chúng tôi sẽ nhận được trình gỡ lỗi khi cảnh báo ban đầu được kích hoạt. Đối với điều đó, bạn nên chạy:
options(error = recover)
Đây là một ví dụ:
> 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:
Sau đó, bạn có thể bước vào bất kỳ khung nào trong số đó để xem điều gì đang xảy ra khi cảnh báo được đưa ra.
Để đặt lại các tùy chọn trên về mặc định, hãy nhập
options(error = NULL, warn = 0)
Đối với cảnh báo cụ thể mà bạn trích dẫn, rất có thể bạn cần cho phép nhiều lần lặp lại trong mã. Khi bạn đã tìm ra cái gì đang gọi glm.fit
, hãy tìm cách chuyển nó vào control
đối số bằng cách sử dụng glm.control
- see ?glm.control
.