R 调试

R 调试 首页 / R入门教程 / R 调试

在计算机编程中,调试是一个多步骤的过程,其中涉及识别问题,找出问题的根源,然后解决问题或确定解决问题的方法。调试的最后一步是测试改进或变通方法,并确保其有效。

由于某些逻辑错误(称为" 错误",语法上正确的程序可能会给我们错误的结果。万一发生此类错误,那么我们需要找出发生这些错误的原因和位置,以便我们进行修复。识别和修复错误的过程称为"调试")。

R Debugging

调试原理

R程序员发现他们花在调试程序上的时间比实际编写或编码它的时间更多。在R中,调试有多种原理,可帮助程序员将时间花在编写和编码上,而不是调试上。这些原则如下:

R Debugging


函数

在R中,出于调试目的,有许多函数可用。这些函数在消除代码中的错误方面起着重要作用。 R提供以下调试函数:

1)traceback()

如果我们的代码已经崩溃,并且我们想知道错误在哪里,请尝试使用traceback()。 traceback()函数打印出发生错误之前调用的函数列表。

让我们看一个示例,以了解如何使用traceback()函数

示例

f <- function(a){  
    x <- a-ql(a)  
    x  
}  
ql<- function(b){  
    r <- b*mn(b)  
    r  
}  
mn<- function(p){  
    r <- log(p)  
    if(r<10)  
        r^2  
    else  
        r^3  
}  
f(-2)  

当我们运行上面的代码时,它将生成以下输出:

R Debugging

2)debug()

在R中,debug()函数允许用户逐步执行一个函数。在任何时候,我们都可以打印变量的值或在函数内绘制结果图。在调试时,我们可以键入" c"继续到当前代码块的末尾。 Traceback()不能告诉我们函数错误发生在哪里。要知道导致错误的行,我们必须使用debug()逐步执行该函数。

让我们看一个示例,以了解如何在R中使用调试函数。

示例

func<- function(a,value){  
subt<- value-a  
squar<- subt^2  
collect <- sum(squar)  
collect  
}  
set.seed(100)  
value <- rnorm(100)  
func(1,value)  
debug(func)  
func(1,value)  

输出

R Debugging

3)browser()

browser()函数会中止函数的执行,直到用户允许其继续执行为止。如果我们不想逐行逐步浏览完整的代码,但是希望在特定时刻停止它,以便我们检查发生了什么,这很有用。

在函数的browser()中插入一个调用会在调用browser()的位置暂停该函数的执行。它与使用debug()相同,除了我们可以控制执行在何处暂停。

链接:https://www.learnfk.comhttps://www.learnfk.com/R/r-debugging.html

来源:LearnFk无涯教程网

让我们看一个示例,以了解如何在R中使用browser()函数。

示例

a<-function(b) {  
  browser() ## 此处插入断点
  c<-log(b)  
  if(c<10)  
    c^2  
  else  
    c^3  
}  
a(-1)  

输出

R Debugging

4)trace()

trace()函数调用允许用户在函数中插入一些代码。对于初次使用的用户,R debug函数trace()的语法有些尴尬。使用debug()可能更好。

让我们看一个示例,以了解如何在R中使用browser()函数。

示例

f <- function(a){  
    x <- a-ql(a)  
    x  
}  
ql<- function(b){  
    r <- b*mn(b)  
    r  
}  
mn<- function(p){  
    r <- log(p)  
    if(r<10)  
        r^2  
    else  
        r^3  
}  
as.list(body(mn))  
trace("mn",quote(if(is.nan(r)){browser()}),at=3,print=FALSE)  
f(1)  
f(-1)  

输出

R Debugging

5)recover()

当我们执行一个函数的调试时,recover()允许我们检查上层函数中的变量。

recovery()函数用作错误处理程序,可使用options()进行设置(例如,Adopt(error=retrieval))。

当函数引发错误时,执行将在失败时停止。我们可以浏览函数调用并检查环境以找到问题的根源。

示例

f <- function(a){  
    x <- a-ql(a)  
    x  
}  
ql<- function(b){  
    r <- b*mn(b)  
    r  
}  
mn<- function(p){  
    r <- log(p)  
    if(r<10)  
        r^2  
    else  
        r^3  
}  
as.list(body(mn))  
trace("mn",quote(if(is.nan(r)){recover()}),at=3,print=FALSE)  
f(-1)  

输出

R Debugging

调试软件包

安装的R软件包可能会导致错误。解决问题的几种方法如下:

  • 设置选项(error=recover),然后使用n逐行处理代码。
  • 在复杂情况下,我们应该具有函数代码的副本。在R中,函数输入用于打印可以复制到文本编辑器中的函数代码。我们可以通过将其加载到全局工作区中,然后执行调试来对其进行编辑。
  • 如果我们的问题没有解决,那么我们必须下载源代码。我们还可以使用devtools软件包以及install(),load_all()函数来使我们的过程更快。

错误处理和恢复

异常或错误处理是对代码事件的响应过程,该事件会中断代码流。异常处理程序的作用域以try开头,以catch结束。 R提供了try()和trycatch()函数。

try()函数是trycatch()的包装函数,该函数将打印错误,然后继续执行。另一方面,trycatch()使我们可以控制错误函数,并且可以选择继续执行该函数的过程。

无涯教程网

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

左耳听风 -〔陈皓〕

深入浅出区块链 -〔陈浩〕

说透数字化转型 -〔付晓岩〕

大数据经典论文解读 -〔徐文浩〕

Spring Cloud 微服务项目实战 -〔姚秋辰(姚半仙)〕

Web漏洞挖掘实战 -〔王昊天〕

网络排查案例课 -〔杨胜辉〕

eBPF核心技术与实战 -〔倪朋飞〕

徐昊 · TDD项目实战70讲 -〔徐昊〕

好记忆不如烂笔头。留下您的足迹吧 :)