当我们谈论R中的调试时, 在python和其他编程IDE上工作的人会感到有些负面。 R本身有一些有用的功能, 例如traceback()和browser()以及RStudio中的交互式工具, 但是不知何故, 内置功能无法解决一些限制。在这种情况下, 我们会陷入困境, 这需要更多的时间来解决。
然后到达调试程序包, 你可以在编写复杂的方法和循环时使用该程序包, 该程序包向你显示运行时变量条目, 并帮助你在更短的时间内解决该错误。尽管你需要为代码输入和调试器的动作上的点进行预计划。与在执行时以困难的方式解决问题相比, 值得花一些时间。
Rstudio中的调试方面
Rstudio提供了一个用于调试的交互式平台, 使检测复杂功能中的错误变得更加容易。
让我们在下面绘制一个函数并应用这些方法。
f <-函数(a)g(a)g <-函数(b)h(b)h <-函数(c)i(c)i <-函数(d)j(d)j <-函数)” a” + e
f(10)
在这里, 你可以浏览到不同的函数以迭代方式检查代码。你浏览的功能将显示其代码。
你可以使用traceback查看由单个函数进行的函数调用的流程。
错误调试
在Rstudio中执行代码时, 如果出现错误, 则Rstudio在其交互式控制台中提供了两种方法来解决该问题。一种是回溯, 向你显示函数调用的流程, 另一种是使用调试重新运行。如果你选择使用调试重新运行, Rstudio将带你进入交互式调试器会话, 该会话还将在发生错误的地方暂停执行。
在编辑器中时, 你可以将其与
或使用键盘:
, n:此按钮将带你进入下一步。
或s:与下一个类似, 但不是下一步, 而是进入下一个功能。
或f:完成当前循环或函数的执行。
, c:退出交互式调试。
, Q:停止调试, 终止函数, 然后返回全局工作区。
在任意代码中设置断点
Rstudio会在错误时进入交互式控制台, 但是你可以使用Rstudio断点或browser()在任意代码位置输入。
可以通过几种方法添加断点:
- 你可以单击代码行左侧。
- 你可以在代码行上按Shift + F9。
- 你可以在需要停止执行的位置添加browser()。
RStudio当前不支持通过传递条件来放置断点的条件断点, 在本教程中讨论的调试程序包中对此做了一些处理。 *
有关这些调试方法的详细信息, 请访问此处。
现在让我们谈谈包调试器。
调试器支持较简单的调试方面, 如果你参与较少的调试工作, 则很容易理解。调试器具有一些简单的功能, 它们是:
- debugr_isActive:-打开和关闭调试模式。
- debugr_switchOff:-打开和关闭调试模式。
- debugr_switchOn:-打开和关闭调试模式。
- dwatch:-在运行时打印调试输出。
在所有这些功能中, dwatch起着至关重要的作用。在更复杂的情况下, 它将调试输出打印到控制台或文件。输出可以是静态文本, 变量的一个或多个值。
对于任何调试功能, 都需要打开调试器的调试功能, 这很容易通过debug_switchOn()完成。你可以将dwatch()函数放在要调试代码的任何位置, 尤其是在生产级代码中, 并可以在任何情况下通过打开它并随后使用debugr_switchOff()函数将其关闭来对其进行调试。
让我们在示例代码中查看dwatch函数的结构。
library(debugr)
debugr_switchOn()
myfunction <- function(x) {
z <- 1
for(i in 1:x) {
dwatch(crit = "z > 40000", objs = c("z", "i"))
z <- z * i
}
# avoiding to print the z
invisible(z)
}
myfunction(10)
##
## ----------------------------- DEBUGR MESSAGE ------------------------------
##
## ** z:
## [1] 40320
##
##
## ** i:
## [1] 9
##
## ---------------------------------------------------------------------------
##
## ----------------------------- DEBUGR MESSAGE ------------------------------
##
## ** z:
## [1] 362880
##
##
## ** i:
## [1] 10
##
## ---------------------------------------------------------------------------
debugr_switchOff()
在这里, 代码将进行迭代乘法, 或者你可以将函数中使用的任何大小写应用于dwatch函数, 并将其应用于条件z> 4000的变量z。因此, 在满足条件并满足所需条件时, 将输出消息打印的结果是z和i变量的值。
你可以使用一些复杂的参数来操纵输出的格式。
debugr_switchOn()
myfunction <- function(x) {
z <- 1
for(i in 1:x) {
dwatch(crit = "z > 40000", expr=c("format(z, big.mark = \", \")", "format(i, big.mark = \", \")"))
z <- z * i
}
# avoiding to print the z
invisible(z)
}
myfunction(10)
##
## ----------------------------- DEBUGR MESSAGE ------------------------------
##
## ** Expression: format(z, big.mark = ", ")
## [1] "40, 320"
##
## ** Expression: format(i, big.mark = ", ")
## [1] "9"
## ---------------------------------------------------------------------------
##
## ----------------------------- DEBUGR MESSAGE ------------------------------
##
## ** Expression: format(z, big.mark = ", ")
## [1] "362, 880"
##
## ** Expression: format(i, big.mark = ", ")
## [1] "10"
## ---------------------------------------------------------------------------
debugr_switchOff()
你可以合并几个参数:
- show.all:通过将此参数设置为TRUE, 可以查看条件的所有对象。
- msg:用于添加静态文本消息。
- show.frame:通过将此参数设置为FALSE, 可以删除上下边框。
- 暂停:通过将此参数设置为TRUE, 可以在满足条件后立即停止事务。
如果你想了解有关R中调试的更多信息, 请参加srcmini的”使用RStudio IDE”(第1部分)课程。
评论前必须登录!
注册