2016-03-17 3 views
3

При отладке часто бывает полезно вставить в код звонок browser(). Если все в порядке, и я хотел бы закончить функцию, я могу использовать c, но если браузер находится в цикле, каким будет подходящий способ игнорировать эти новые вызовы?как игнорировать будущие вызовы браузера

Я просмотрел browser помощь, но ничего не нашел. Я сейчас делаю:

browser <- function(...){NULL} 

Замена функции оригинального браузера, но она не совсем насыщающая.

ответ

2

Вы можете обернуть browser в своем вызове и сделать его условным:

breakpoint = function() 
    if (! exists('.break_disabled', parent.env(environment()))) 
     browser(skipCalls = 1L) 

Опция skipCalls используется потому, что browser вызов вложен внутри функции, а не вызывается непосредственно из где вы хотите разорвать.

Теперь вам просто нужно поставить две функции для переключения точки останова:

disable_break = function() 
    assign('.break_disabled', TRUE, parent.env(environment())) 

enable_break = function() 
    if (exists('.break_disabled', parent.env(environment()))) 
     rm(.break_disabled, envir = parent.env(environment())) 

Стоит отметить, что только вставив вышеуказанные функции в сценарий или R сессия будет загрязнять глобальное пространство имен со скрытым объектом. Обычно я определяю эти функции в своей среде. Однако для целей отладки это должно быть хорошо.

+0

Очень элегантный, хотя для этого требуется, чтобы вы использовали точку останова() все время вместо браузера – cmbarbu

+0

@cmbarbu На самом деле вы могли бы назвать эту функцию «браузером», а затем внутри вызова «base :: browser». –

+0

Правильно, поэтому, если мне очень нужно продолжить цикл, я могу использовать этот браузер <- вашу функцию, вызывающую base :: browser(), чтобы сделать трюк. – cmbarbu

Смежные вопросы