在 R 中优化期间添加调试中断

Adding debugging breaks during optimization in R

假设我有以下功能需要优化:

func <- function(x) {
  mx <- matrix(x, nrow = 2)
  inv <- solve(mx)
  det(inv)
}

最小化这个函数不是问题,只要 x 总是可逆的(例如,运行ning optim(c(1, 0, 0, 1), func) 不会产生错误)。

现在让我们从一开始就给它一个不可解的矩阵。 运行 optim(c(0, 0, 0, 0), func) 产量

Error in solve.default(mx) : Lapack routine dgesv: system is exactly singular: U[1,1] = 0

现在想象问题的根源不是那么明显,所以我在下面添加 if 语句来尝试调查矩阵不可逆的原因。

func <- function(x) {
  mx <- matrix(x, nrow = 2)
  if (class(try(solve(mx))) == "try-error") {
    break
  }
  inv <- solve(mx)
  det(inv)
}

上面的 break 语句 旨在让 R 在该行 进入调试模式,但它并没有这样做。文档说 break "breaks out of a for, while or repeat loop",因此 optim() 运行 被隐式排除。我应该写些什么才能得到想要的结果?

browser() 函数非常适合在 RStudio 中进行调试。另一种选择是在 RStudio 中添加断点,但这显然依赖于 IDE 并且实际上不是您代码的一部分。

if (class(try(solve(mx))) == "try-error") {
  browser()
}

一旦代码到达 browser(),将调用 browser 调用时与当前环境的交互式会话,这还允许您在控制台中执行 运行 命令。这对于试用将存在于函数中的代码有很大帮助,并且您不一定确定代码到达该行后它将如何运行。

除了有关如何解释调用堆栈的信息外,要比较这些方法,请参阅 this article