R 程式設計/除錯
外觀
< R 程式設計
一些基本提示
[edit | edit source]- 在函式中使用
print()語句列印變數值。 儘管這種技術被一些人認為是低技術或過時,但它仍然可以成為快速簡便地跟蹤錯誤的方法。 - 在函式中崩潰行之前放置一個
browser()語句。 當函式被呼叫時,它將被執行到browser()行。 然後命令列介面切換到函式環境,以便可以檢查或更改函式中的所有變數。 有關browser()模式下可用的命令,請參閱以下內容。
使用traceback()跟蹤錯誤
[edit | edit source]R 中的標準錯誤訊息將告訴您哪個函式引發了錯誤。 以以下函式為例,其唯一目的是引發錯誤。
myFun <- function(){
stop("Woops! An error")
}
對myFun()的呼叫給出
> myFun()
Error in myFun() : Woops! An error
在引發錯誤後,traceback()函式允許您顯示導致錯誤的呼叫堆疊。 例如,以下函式呼叫myFun。
myFun2 <- function(){
myFun()
}
呼叫myFun2()和traceback()給出
> myFun2()
Error in myFun() : Woops! An error
> traceback()
3: stop("Woops! An error")
2: myFun()
1: myFun2()
traceback()函式每次引發錯誤時都可以自動執行,選項為
options(error=traceback)
它可以用以下方式再次關閉
options(error=NULL)
逐行執行程式碼
[edit | edit source]一個函式可以透過將其設定為除錯模式來執行
debug(FUNCTION_NAME)
.
然後,當函式被呼叫時,將在該函式的環境中開啟一個瀏覽器,以便可以逐行執行它。 在除錯瀏覽器中,除了所有標準的 **R** 功能外,還可以使用以下命令。
| 命令 | 含義 |
|---|---|
n |
前進到下一步。 空行也可以。 |
c, cont |
繼續到當前上下文的結尾。 例如,到迴圈內的迴圈的結尾或函式的結尾。 |
where |
列印函式呼叫的堆疊(你在哪裡?) |
Q |
退出瀏覽器並返回到頂級 **R** 提示符。 |
除錯可以用以下方式關閉
undebug(FUNCTION_NAME)
還有一些相關的函式
debugonce()在第一次呼叫後關閉除錯。isdebugged()檢查函式是否處於除錯模式。
瀏覽呼叫堆疊
[edit | edit source]這是 **R base** 中最先進的除錯選項。 透過設定 options(error=recover) ,您將有機會瀏覽呼叫堆疊中的任何環境。 例如,
> options(error=recover)
> myFun2()
Error in myFun() : Woops! An error
Enter a frame number, or 0 to exit
1: myFun2()
2: myFun()
Selection:
在Selection:後面輸入“1”或“2”,瀏覽器將跳轉到選定的環境。進入瀏覽器後,所有標準的R功能都可供使用,以及下表中的命令。
| 命令 | 含義 |
|---|---|
c, cont |
退出瀏覽器,並繼續執行下一條語句。空行將執行相同操作。 |
n |
進入單步偵錯程式(這會改變c的含義)。 |
where |
列印活動函式呼叫的堆疊跟蹤(你在堆疊中的位置?)。 |
Q |
退出瀏覽器,不要繼續執行下一條語句,而是返回到頂層R瀏覽器。 |
可以透過以下方式關閉恢復模式
options(error=NULL)
