Отладка замыканий R

Для отладки функции foo в файле foo.R

foo <- function() {
    a <- c(2, 3)
}

можно написать "драйверный" файл

source("foo.R")
debug(f)
f()

Это может быть тривиально расширено для многих таких функций в той же области.

Отладка функции bar() внутри тела foo немного утомительна

foo <- function() {
    bar <- function() {
        a <- c(2, 3)
    }
    bar()
}

можно начать с того же файла драйвера (на практике это тестовый файл), загрузить bar(), не запуская его, набрать debug(bar) в приглашении отладки, а затем запустить bar(). Мне интересно, есть ли лучший способ многократного закрытия.

Есть ли способ указать в драйвере / тестовом файле, что я хочу отлаживать внутреннюю функцию bar, что-то вроде debug(foo::bar)?

Предоставляет ли R стандартный синтаксис для обращения к внутренним функциям (например, вложенным функциям, замыканиям и т. Д.)?

Связанные вопросы:


person Vrokipal    schedule 28.02.2018    source источник
comment
Хороший вопрос, но я думаю, что нет. Но если что-то и может сделать это, возможно, trace() - хорошее место для поиска. Вы также можете изучить что-то вроде setBreakpoint(), но в нем используется номер строки, а не имена функций.   -  person MrFlick    schedule 01.03.2018
comment
Просто продолжаем идею трассировки - работает что-то вроде этого: trace(foo, quote(debug(bar)), at=3), но вы должны установить at= в некоторую точку после определения функции и до ее вызова, так что это не круто.   -  person MrFlick    schedule 01.03.2018


Ответы (1)


Вы можете просто поставить browser() в точку, в которой должен запускаться отладчик:

foo <- function() {
    print("In foo")
    bar()
    return(NULL)
}

bar <- function() {
    print("In bar")
    dash()
    return(NULL)
}

dash <- function() {
    print("In dash")
    browser()
    return(NULL)
}

foo()
person Aleh    schedule 28.02.2018
comment
Я избегал browser(). Абсурдно изменять исходные файлы при их отладке. В любом случае, как это помогает при отладке закрытий? - person Vrokipal; 01.03.2018
comment
@Vrokipal В вашем последнем примере bar() будет определен во время выполнения foo(), и он существует только во время выполнения foo() и только в его области. Так что, может быть, абсурд не так уж и абсурден. - person Aleh; 01.03.2018
comment
@Aleph Да, конечно, его еще нет. Опять же, как ваше решение решает проблему закрытия отладки ?? - person Vrokipal; 05.03.2018