调试 package::function() 尽管使用惰性求值

Debugging package::function() although lazy evaluation is used

如果由于懒惰评估而导致包未知,我如何在 R 中高效调试。我想保留基本的 browser() 功能,因为它运行良好 - 即使使用 testthat package。正如下面中所解释的,--with-keep.source是为我的项目在"project options => Build Tools"中设置的。

要重现该行为,请创建一个包含

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

和脚本example.R

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

编辑TestDebug::myfun(1,2)调用otherpackage::myfun2(1,2)的情况也应该包括在内。我觉得这种情况应该出现在每个"real" package?

以下适合我。

我有我的包 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) 被称为 I 运行 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(..))只调试一次函数。