9

有时您将多个browsers 放入一个函数中进行调试。我知道你可以退出整个shebang,Q但是如果你想退出第二个浏览器(见下面的代码)并返回到第一级浏览器怎么办?我听说过 typec但这并没有退出第二级browser

FUN <- function() {
browser()                      #first one
    lapply(1:10, function(x) {
browser()                      #second one
        return(x)
    })
}

FUN()
4

4 回答 4

9

键入c 确实会退出当前浏览器上下文。

但是,您的代码在执行期间会执行一个“第一级”和 10 个不同的“第二级”浏览器调用。结果,当您退出一个二级浏览器时,您几乎立即被扔到一个浏览器中,因此看起来打字c不起作用。

键入c <RETURN>11 次以确认这是正在发生的事情。

> FUN()
Called from: FUN()
Browse[1]> c
Called from: FUN(1:10[[1L]], ...)
Browse[1]> c
Called from: FUN(1:10[[2L]], ...)
Browse[1]> c
Called from: FUN(1:10[[3L]], ...)
Browse[1]> c
Called from: FUN(1:10[[4L]], ...)
Browse[1]> c
Called from: FUN(1:10[[5L]], ...)
Browse[1]> c
Called from: FUN(1:10[[6L]], ...)
Browse[1]> c
Called from: FUN(1:10[[7L]], ...)
Browse[1]> c
Called from: FUN(1:10[[8L]], ...)
Browse[1]> c
Called from: FUN(1:10[[9L]], ...)
Browse[1]> c
Called from: FUN(1:10[[10L]], ...)
Browse[1]> c
于 2012-12-01T20:19:22.067 回答
8

我同意 Josh 的观点,并想建议您当前代码的这两种替代方案:

1) debugonce: 如果我们调用foo你的内部函数,那么debugonce(foo)只会在第一次foo调用时启动调试器,当x==1.

FUN <- function() {
  browser()
  foo <- function(x)return(x)
  debugonce(foo)
  lapply(1:10, foo)
}

2)debugundebug。运行后debug(foo),每次foo调用调试器都会启动,直到你运行undebug(foo)

FUN <- function() {
  browser()
  foo <- function(x)return(x)
  debug(foo)
  lapply(1:10, foo)
}

当您想停止调试foo时,请undebug(foo)在点击之前输入c,它将带您回到第一级浏览器。

于 2012-12-01T22:45:04.213 回答
4

我在第二个浏览器之后添加qwer(或其他一些不存在的对象)。然后我手动翻阅代码,当我想退出第二个浏览器时,我只需按c. 它抛出对象不存在的错误。您将被退回到第一个浏览器调用。

于 2012-12-02T12:23:23.957 回答
0

运行 undebug(yourFunction) 这将终止调试,但仍保留在浏览器提示符处,然后键入 c 并(可能几次)返回到常规命令提示符

于 2015-02-20T23:03:07.333 回答