10

更新:

我个人将此问题标记为重复,因为此问题似乎与@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)))

这是走过

> 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
> 
4

1 回答 1

6

这是一个可能有点老套的想法,它利用browser()'sexpr=参数允许您随时关闭循环内的浏览。

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
于 2013-10-22T16:29:05.170 回答