我有一个R脚本,我插入了以下代码:
options(Debug=TRUE)
#SOME MORE CODE
browser(expr = isTRUE(getOption("Debug")))
#SOME MORE CODE
调试器启动后,我希望它继续下一行,所以我输入n
。然而,这并没有进入下一行,而是似乎继续。
如何在browser()
声明后单步执行其余代码?
由于
答案 0 :(得分:5)
要在函数中设置开始调试的点,您可能希望使用trace()
。
假设您有一个函数myFun
,并希望在调用plot()
之前开始调试它:
myFun <- function() {
x <-
8:1
y <-
1:8
plot(y~x)
lines(y~x)
text(x,y, letters[1:8], pos=3)
}
要构建对trace
的调用,您需要知道myFun
对plot()
的调用在哪一步。要确定 ,请使用构造as.list(body(myFun))
:
as.list(body(myFun))
# [[1]]
# `{`
#
# [[2]]
# x <- 8:1
#
# [[3]]
# y <- 1:8
#
# [[4]]
# plot(y ~ x)
#
# ... More ...
在注意到在第4步中调用绘图后,您可以使用trace()
告诉R您每次调用myFun
时都要在步骤4之前进入浏览器:< / p>
trace(myFun, browser, 4)
# TRY IT OUT
# (Once in the browser, type "n" and press Enter to step through the code.)
myFun()
最后,当您完成调试功能后,通过调用untrace(myFun)
关闭跟踪。
编辑:为源内脚本设置断点的策略类似。同样,您实际上并未在脚本中插入代码。而是使用findLineNum()
和setBreakPoint()
。
假设上面描述的函数myFun()
是在文本文件"myScript.R"
中定义的,它在函数定义之前有五个空行。在调用plot之前插入断点:
source("myScript.R") # Must source() once before using findLineNum
# or setBreakPoint
findLineNum("myScript.R#10") # I see that I missed the step by one line
setBreakpoint("myScript.R#11") # Insert the breakpoint at the line that calls
# plot()
myFun() # Test that breakpoint was properly inserted
# (Again, use "n" and Enter to step through code)
答案 1 :(得分:1)
browser()
通常在交互模式下运行并在子函数中使用时使用,因为如果你在脚本和源中内联它,那么整个内容将只是在浏览器提示时执行下一行。它叫做。
E.g。假设脚本:
options(Debug=TRUE)
browser(expr = isTRUE(getOption("Debug")))
b <- 1
b <- 2
b <- 3
它会像这样执行:
R> options(Debug=TRUE)
R> browser(expr = isTRUE(getOption("Debug")))
Called from: top level
Browse[1]> b <- 1
Browse[1]> b <- 2
Browse[1]> b <- 3
如果您要逐步运行脚本然后调用函数,那么它的使用更有意义:
R> options(Debug=TRUE)
R> a <- function() {
browser(expr = isTRUE(getOption("Debug")))
b <- 1
b <- 2
b <- 3
return(b)
}
R> e <- a()
Called from: a()
Browse[1]> n
debug at #5: b <- 1
Browse[2]> # ENTER
debug at #6: b <- 2
Browse[2]> b
[1] 1
Browse[2]> # ENTER
debug at #7: b <- 3
Browse[2]> b
[1] 2
Browse[2]> # ENTER
debug at #8: return(b)
Browse[2]> b
[1] 3
Browse[2]> # ENTER
[1] 3
R>