如果由于惰性评估而未知包,我如何在R中有效调试.我想保留基本browser()功能,因为它工作得很好 - 即使是testthat package.如以下文章中所述,--with-keep.source在"项目选项=>构建工具"中为我的项目设置.
要重现该行为,请创建一个TestDebug包含的包
myfun <- function(a,b) {return(a+b)}
Run Code Online (Sandbox Code Playgroud)
和一个脚本 example.R
{
browser()
TestDebug::myfun(1,2)
}
Run Code Online (Sandbox Code Playgroud)
编辑:还应涵盖TestDebug::myfun(1,2)呼叫的情况otherpackage::myfun2(1,2).我认为情况应该发生在每个"真正"的包装中?
以下适用于我.
我有TestDebug我的功能包
myfun <- function(a,b) {return(a+b)}
如果我运行脚本
debug(TestDebug::myfun)
TestDebug::myfun(1,2)
Run Code Online (Sandbox Code Playgroud)
调试器的步骤直接进入源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(..))仅调试一次函数.