一种快速而肮脏的方法是包装你的函数并打印出传递给它的参数。这是执行此操作的示例会话。
f <- function(par, data){
if(0.1 < par & par < .9){
return(Inf)
}else{
sqrt(abs(par))
}
}
并使用 optim 调用它...
> optim(2, f, method = "L-BFGS-B", lower = -1)
Error in optim(2, f, method = "L-BFGS-B", lower = -1) :
L-BFGS-B needs finite values of 'fn'
现在包装代码...
wrap_f <- function(par, ...){
cat(par, "\n")
f(par, ...)
}
现在我们可以看到叫什么了...
> optim(2, wrap_f, method = "L-BFGS-B", lower = -1)
2
2.001
1.999
1.646447
1.647447
1.645447
1.256777
1.257777
1.255777
-0.3018999
-0.3008999
-0.3028999
0.7441084
Error in optim(2, wrap_f, method = "L-BFGS-B", lower = -1) :
L-BFGS-B needs finite values of 'fn'
所以在这个例子中,它最终试图评估 .7441084,它给出了函数定义方式的错误。