我个人认为这个问题是重复的,因为这个问题似乎与@ TylerRinker的问题几乎相同.但是,我仍然认为这个具体问题没有答案.虽然我喜欢debug/debugonce那些不同的(虽然非常有用)工具,但我仍然对如何控制browser上下文感到好奇.
在调试时,browser从另一个browser上下文中进入上下文很容易并且通常很有帮助.当从迭代循环调用嵌套级别时,退出到前一个上下文需要单步执行每次迭代.退出所有上下文的Q退出. browser
有没有办法指定要退出的上下文而无需在较低的上下文中手动进行所有迭代?
在下面的例子中,这意味着回到Browse [1]无需打c100次
我使用的两个要么是
(1)修改迭代次数,要么
(2)使用Q,再次调用我的原始函数,然后前进到我以前的位置.
既不构成"伟大",也不构成"好".
例:
outerFunc <- function() {
# < ... cropped .. >
browser()
# < ... cropped .. >
}
outerFunc()
lapply(seq(100), function(i) browser(text=paste("i is #", i)))
Run Code Online (Sandbox Code Playgroud)
> outerFunc()
Called from: outerFunc()
Browse[1]> lapply(seq(100), browser)
Called from: lapply(seq(100), browser)
Browse[2]> c
Called from: lapply(seq(100), browser)
Browse[2]> c
Called from: lapply(seq(100), browser)
Browse[2]> c
Called from: lapply(seq(100), browser)
Browse[2]> Q # <~~~~~~ `Q` quits all contexts
>
Run Code Online (Sandbox Code Playgroud)
这是一个可能有点讨厌的想法,利用browser()的expr=参数允许你随时关闭循环中的浏览.
outerFunc <- function() {
# < ... cropped .. >
BROWSE <- TRUE
browser()
# < ... cropped .. >
}
outerFunc()
lapply(seq(100), function(i) browser(text=paste("i is #", i),
expr=BROWSE))
Called from: FUN(1:100[[1L]], ...)
Browse[2]>
Called from: FUN(1:100[[2L]], ...)
Browse[2]>
Called from: FUN(1:100[[3L]], ...)
Browse[2]>
Called from: FUN(1:100[[4L]], ...)
Browse[2]>
Called from: FUN(1:100[[5L]], ...)
Browse[2]> BROWSE <<- FALSE ## From here on, browser() won't be triggered
Browse[2]>
[... many snipped lines ...]
Browse[1]> ## so that you're returned to next level
## up without further interruption
Run Code Online (Sandbox Code Playgroud)