跳轉到內容

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)
華夏公益教科書