我尝试使用语法“source”来拆分 r 脚本。问题是,如果 script_a.r 使用 script_b.r 中的函数并且我运行 script_a.r,则调试器将忽略 source_b.r 中的任何断点,即使 source_b.r 中的代码已运行。
我发现的唯一解决方法是编写“browser()”而不是断点。虽然这看起来同样好,但很烦人。为了阻止它停止在那里,我必须删除该 browser() 行,再次保存源文件。另外,我发现调试器有时会跳转到代码的错误部分,但也许这是另一个问题。此外,我真正喜欢 VSC/Python 调试模式的另一个特点是,如果出现错误/崩溃,调试器就会停止。当它停止时,我可以看到哪里出了问题,检查同一范围内的其他变量并从那里开始工作。但也许这也是另一个问题。
我当然已经用谷歌搜索过这个,但还没有找到那么多。也许我使用 R/RStudio 的方式错误?也许我不应该如此依赖调试器?或者我应该在组合使用之前更单独地测试我自己的源文件?或者这是否意味着 r 脚本不应该以这种方式分割?我最好使用 python 来代替吗?
背景:我已经使用 R 近 10 年了,主要是用于下载数据、进行一些简单计算以及将结果写入 excel 文件或 jpg 文件的简单脚本。我是一名统计学家,没有真正的编程知识,我猜我的编程相当草率,有很多全局变量、长函数、长脚本。三年前,我开始用 Python 构建一个更复杂的(精算/养老金)模型。我开始将代码分成许多不同的文件/模块,并尝试避免全局变量。我真的很喜欢这个,它通过在更有限的范围内减少认知负荷来帮助我的过程。我还开始大量使用调试器,因为这是一种验证所有这些函数内部发生的情况以及查看调用堆栈的简单方法。现在我再次回到 R,并想带上其中一些想法。
RStudio 的调试器经常会跳过源文件中的断点,这可能会令人沮丧。一个可靠的解决方法是使用
browser()
代替断点,尽管它不太方便。为了简化调试,请将 browser()
包含在条件语句中(例如 if (debug_mode) browser()
),以便您可以打开或关闭它。对于类似于 Python 的错误处理,请尝试 options(error = recover)
,它会在出现错误时停止执行,让您检查变量。独立测试功能并使用单元测试 (testthat
) 还可以帮助更有效地管理拆分脚本。