r-调试包::function(),尽管使用了延迟求值

  • 本文关键字:延迟 调试 function r rstudio
  • 更新时间 :
  • 英文 :


如果包由于延迟求值而未知,我如何在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(..))只调试一次函数。