Debugging browser()调试语句

Debugging browser()调试语句,debugging,r,browser,Debugging,R,Browser,我有一个R脚本,其中插入了以下代码: options(Debug=TRUE) #SOME MORE CODE browser(expr = isTRUE(getOption("Debug"))) #SOME MORE CODE 调试器启动后,我希望它继续到下一行,因此我键入n。然而,这并没有继续到下一行,而是似乎在继续 在browser()语句之后,如何逐步完成代码的其余部分 感谢在函数中设置一个开始调试的点,您可能需要使用trace() 假设您有一个函数myFun,并希望在调用plot()之

我有一个R脚本,其中插入了以下代码:

options(Debug=TRUE)
#SOME MORE CODE
browser(expr = isTRUE(getOption("Debug")))
#SOME MORE CODE
调试器启动后,我希望它继续到下一行,因此我键入
n
。然而,这并没有继续到下一行,而是似乎在继续

browser()
语句之后,如何逐步完成代码的其余部分


感谢在函数中设置一个开始调试的点,您可能需要使用
trace()

假设您有一个函数
myFun
,并希望在调用
plot()
之前开始调试它:

注意到在步骤4中调用plot后,每次调用
myFun
时,您都可以使用
trace()
告诉R您希望在步骤4之前进入浏览器:

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”
中定义的,在函数定义之前有五行空行。要在调用绘图之前插入断点,请执行以下操作:

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)

要在函数中设置开始调试的点,可能需要使用
trace()

假设您有一个函数
myFun
,并希望在调用
plot()
之前开始调试它:

注意到在步骤4中调用plot后,每次调用
myFun
时,您都可以使用
trace()
告诉R您希望在步骤4之前进入浏览器:

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”
中定义的,在函数定义之前有五行空行。要在调用绘图之前插入断点,请执行以下操作:

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)
browser()
通常在交互模式下运行时使用,并在子函数中使用,因为如果将其内联到脚本和源代码中,则调用它时,整个内容只需在浏览器提示下执行下一行

例如,假设脚本:

options(Debug=TRUE)
browser(expr = isTRUE(getOption("Debug")))
b <- 1 
b <- 2
b <- 3
选项(Debug=TRUE)
浏览器(expr=isTRUE(getOption(“Debug”))
b
browser()
通常在交互模式下运行时使用,并在子函数中使用,因为如果在脚本和源代码中内联了它,那么调用它时,它中的所有内容都将在浏览器提示下执行下一行

例如,假设脚本:

options(Debug=TRUE)
browser(expr = isTRUE(getOption("Debug")))
b <- 1 
b <- 2
b <- 3
选项(Debug=TRUE)
浏览器(expr=isTRUE(getOption(“Debug”))

b谢谢你的回答。我不是在调试一个函数,而是一个相当长的脚本(也许它应该模块化一点)。对于函数,我一直在做
debug(myFun)
,这似乎很有效。然而,我想在我的脚本中设置一个断点,并在该断点后逐步完成我的代码…在那里,我添加了一个示例,演示如何在脚本中设置断点。很好,与调用
trace
一样,实际上不需要在脚本文件中的函数定义中插入任何代码。干杯乔希,谢谢你的回答。如何设置断点而不首先寻找整个脚本?谢谢。嗨,Alex——要在函数中插入调试代码,R需要将该函数读入当前的R会话(以便它存在!),所以我很确定,至少在要调试的函数中,
source()
ing是没有办法的。最简单的方法可能是将要调试的函数分解成自己的源文件;然后,为了调试函数,您只需要输入代码的这一位。这有意义吗?谢谢你的回答。我不是在调试一个函数,而是一个相当长的脚本(也许它应该模块化一点)。对于函数,我一直在做
debug(myFun)
,这似乎很有效。然而,我想在我的脚本中设置一个断点,并在该断点后逐步完成我的代码…在那里,我添加了一个示例,演示如何在脚本中设置断点。很好,与调用
trace
一样,实际上不需要在脚本文件中的函数定义中插入任何代码。干杯乔希,谢谢你的回答。如何设置断点而不首先寻找整个脚本?谢谢。嗨,Alex——要在函数中插入调试代码,R需要将该函数读入当前的R会话(以便它存在!),所以我很确定,至少在要调试的函数中,
source()
ing是没有办法的。最简单的方法可能是将要调试的函数分解成自己的源文件;然后,为了调试函数,您只需要输入代码的这一位。这有意义吗?
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>