在 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。
假设我有以下功能需要优化:
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。