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