调试包:: function()虽然使用了延迟评估

Chr*_*oph 10 r rstudio

如果由于惰性评估而未知包,我如何在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).我认为情况应该发生在每个"真正"的包装中?

sym*_*ush 5

以下适用于我.

我有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(..))仅调试一次函数.