首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >browser()调试语句R

browser()调试语句R
EN

Stack Overflow用户
提问于 2012-01-24 06:49:33
回答 2查看 2.1K关注 0票数 1

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

代码语言:javascript
复制
options(Debug=TRUE)
#SOME MORE CODE
browser(expr = isTRUE(getOption("Debug")))
#SOME MORE CODE

在调试器启动后,我希望它继续到下一行,所以我输入n。然而,这不会继续到下一行,而是似乎会继续。

如何单步执行browser()语句后的其余代码?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-24 07:50:54

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

假设您有一个函数myFun,并且想要在它调用plot()之前开始调试它

代码语言:javascript
复制
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))

代码语言:javascript
复制
as.list(body(myFun)) 
# [[1]]
# `{`
# 
# [[2]]
# x <- 8:1
# 
# [[3]]
# y <- 1:8
# 
# [[4]]
# plot(y ~ x)
# 
# ... More ... 

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

代码语言:javascript
复制
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之前插入断点:

代码语言:javascript
复制
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)
票数 5
EN

Stack Overflow用户

发布于 2012-01-24 19:01:35

browser()通常在交互模式下运行时使用,并在子函数中使用,因为如果您将其内联在脚本中并提供源代码,那么当调用它时,它将简单地根据浏览器提示执行下一行。

例如,假设脚本:

代码语言:javascript
复制
options(Debug=TRUE)
browser(expr = isTRUE(getOption("Debug")))
b <- 1 
b <- 2
b <- 3

它将像这样执行:

代码语言:javascript
复制
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

如果你一步一步地运行脚本,然后调用一个函数,那么它的使用就更有意义了:

代码语言:javascript
复制
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> 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8979759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档