调试 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(..)
)只调试一次函数。
如果由于懒惰评估而导致包未知,我如何在 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(..)
)只调试一次函数。