Отладка пакета:: function(), хотя используется ленивая оценка

Как я могу эффективно отлаживать R, если пакеты неизвестны из-за ленивой оценки. Я бы хотел сохранить базовую функциональность browser(), поскольку она отлично работает - даже с testthat package. Как поясняется в следующем post, для моего проекта в = > Build Tools > установлен --with-keep.source.

Чтобы воспроизвести поведение, создайте пакет TestDebug, содержащий

myfun <- function(a,b) {return(a+b)}

и script example.R

{
browser()
TestDebug::myfun(1,2)
}

Изменить. Также должна быть рассмотрена ситуация, когда TestDebug::myfun(1,2) вызывает otherpackage::myfun2(1,2). Я думаю, что ситуация должна произойти в каждом "реальном" пакете?

Ответ 1

Для меня работает следующее.

У меня есть мой пакет TestDebug с моей функцией

myfun <- function(a,b) {return(a+b)}

Если я запустил script

debug(TestDebug::myfun)
TestDebug::myfun(1,2)

Отладчик направляется прямо в источник TestDebug::myfun() не в функцию :: так же, как при размещении browser() перед вызовом TestDebug::myfun(1,2).

Как вы упомянули в своем вопросе: в реальных ситуациях TestDebug::myfun(1,2) часто вызывает otherpackage::myfun2(1,2). Если вы попытаетесь войти в otherpackage::myfun2(1,2), вы снова окажетесь внутри функции ::.

Чтобы предотвратить это, я добавляю эти функции, называемые внутри других функций индексом debug "на лету":

Как только вы находитесь на линии внутри TestDebug::myfun(), где вызывается otherpackage::myfun2(1,2), я запускаю debug(otherpackage::myfun2(1,2)) в консоли. После этого я могу без проблем войти в otherpackage::myfun2(1,2) и закончить в исходном коде otherpackage::myfun2(1,2). (..и не в исходном коде ::)

Не забудьте позвонить undebug(otherpackage::myfun2(1,2)) после того, как вы уверены, что ваша проблема не находится внутри otherpackage::myfun2(1,2), чтобы предотвратить отладчик в otherpackage::myfun2(1,2) при следующем вызове.

Если вы предпочитаете, вы можете также использовать debugonce(otherpackage::myfun(1,2)) (вместо debug(..)) только для отладки функции один раз.