跳转到内容

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)
华夏公益教科书