Вложенные вызовы браузера - выход из одного контекста

UPDATE:

Я лично отметил этот вопрос как дубликат, так как этот вопрос кажется почти идентичным тому, что @TylerRinker's. Тем не менее, , я бы по-прежнему рассматривал этот конкретный вопрос без ответа. Хотя мне нравится debug/debugonce, это разные (хотя и очень полезные) инструменты, и мне остается любопытно, как управлять контекстами browser.

________________________________________________________________

Оригинальный вопрос:

При отладке легко и часто полезно перейти в контекст browser из другого контекста browser. Когда вложенный уровень вызывается из итеративного цикла, выход из предыдущего контекста требует перехода через каждую итерацию. Выход из Q завершается из всех контекстов browser.

Вопрос:

Есть ли способ указать, какой контекст должен выйти, без необходимости вручную проходить через все итерации в нижнем контексте?

В приведенном ниже примере это означает возврат к Browse [1] без нажатия c 100 раз

Я использую либо (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
> 

Ответ 1

Вот одна, может быть, немного взломанная идея, которая использует аргумент 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