Проблема возникает из-за того, что адрес памяти x
не обновляется, когда он изменяется на третьей итерации алгоритма оптимизации по методу "BFGS" или "L-BFGS-B", как и должно быть.
Вместо этого адрес памяти x
остается тем же, что и адрес памяти xx
на третьей итерации, и это приводит к обновлению xx
до значения *За 1009 * до того, как функция fn
запустится в третий раз, что заставит функцию возвращать значение «памяти», равное ret
.
. Вы можете проверить это самостоятельно, запустив следующий код, который получаетадрес памяти x
и xx
внутри fn()
с использованием функции address()
имен envnames или data.table пакета:
library(envnames)
makeFn <- function(){
xx <- ret <- NA
fn <- function(x){
cat("\nAddress of x and xx at start of fn:\n")
cat("address(x):", address(x), "\n")
cat("address(xx):", address(xx), "\n")
if(!is.na(xx) && x==xx){
cat("x=", xx, ", ret=", ret, " (memory)", fill=TRUE, sep="")
return(ret)
}
xx <<- x; ret <<- sum(x^2)
cat("x=", xx, ", ret=", ret, " (calculate)", fill=TRUE, sep="")
ret
}
fn
}
fn <- makeFn()
# Run the optimization process
optim(par=0.1, fn=fn, method="L-BFGS-B")
чей частичный вывод (при условии, что оптимизация не выполнялась до запуска этого фрагмента кода) будет похож на следующее:
Address of x and xx at start of fn:
address(x): 0000000013C89DA8
address(xx): 00000000192182D0
x=0.1, ret=0.010201 (calculate)
Address of x and xx at start of fn:
address(x): 0000000013C8A160
address(xx): 00000000192182D0
x=0.101, ret=0.010201 (calculate)
Address of x and xx at start of fn:
address(x): 0000000013C8A160
address(xx): 0000000013C8A160
x=0.099, ret=0.010201 (memory)
Эта проблема не возникает с другими методами оптимизации, доступными вoptim()
, например, по умолчанию.
Примечание. Как уже упоминалось, пакет data.table
также можно использовать для получения адреса объектов в памяти, но здесь я пользуюсь возможностью для продвижения моего недавно выпущенногоpackage envnames (который, кроме получения адреса памяти объекта, также извлекает определяемые пользователем имена среды из их адреса памяти - среди прочего)