如果包由于延迟求值而未知,我如何在R中高效调试。我希望保留基本的browser()
功能,因为它工作得很好——即使使用testthat package
也是如此。正如在下面的文章中所解释的,--with-keep.source
是在"项目选项=>构建工具"中为我的项目设置的。
要再现行为,请创建包含的包TestDebug
myfun <- function(a,b) {return(a+b)}
和脚本example.R
{
browser()
TestDebug::myfun(1,2)
}
编辑:还应涵盖TestDebug::myfun(1,2)
调用otherpackage::myfun2(1,2)
的情况。我认为这种情况应该发生在每一个"真实"的包裹中?
以下内容适用于我。
我有我的包TestDebug
和我的功能
myfun <- function(a,b) {return(a+b)}
如果我运行脚本
debug(TestDebug::myfun)
TestDebug::myfun(1,2)
调试器直接进入TestDebug::myfun()
的源,而不是像在调用TestDebug::myfun(1,2)
之前放置browser()
那样进入::
函数。
正如你在问题中提到的:在现实生活中,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)
的源代码。(..且不在::
的源代码中)
在确定问题不在otherpackage::myfun2(1,2)
内部之后,不要忘记调用undebug(otherpackage::myfun2(1,2))
,以防止调试器在下次调用时跳转到otherpackage::myfun2(1,2)
。
如果您愿意,也可以使用debugonce(otherpackage::myfun(1,2))
(而不是debug(..)
)只调试一次函数。