我试图最小化一个函数,在概念上类似于:
minim<-function(a,b,state){
if(state=="TRUE"){out<-2*a^2+b}else{out<-2*a^3-b}
return(out) }
我这样调用GenSA(我希望只优化a
和b
,而不优化state
):
upper_limits<-c(10,10)
lower_limits<-c(-10,-10)
params<-c(1,1)
minim<-function(a,b,state){
if(state=="TRUE"){out<-2*a^2+b}else{out<-2*a^3-b}
return(out)
}
minim_state_TRUE_fit<-GenSA(par=params,function(params) minim(params[1],params[2]),
lower=lower_limits, upper=upper_limits,
control=list(max.time=100),state="TRUE")
得到的错误是:
Error in fn(par, ...) : unused argument (state = "TRUE")
GenSA
应该能够接受额外的参数,它将传递给被调用的函数。由于某种原因,state="TRUE"
似乎没有被传递给minim
。我写错了吗?我没能找到GenSA
使用的一个例子,其中一个额外的参数被用来检查我的R语法。
您正在优化函数function(params) minim(params[1],params[2])
。这个函数不包含参数state
。你可以这样修改:
minim <- function(a, b, state) {
if (state) {
out <- 2 * a^2 + b
} else {
out<-2 * a^3 - b
}
return(out)
}
fn = function(params, state) minim(params[1],params[2], state)
minim_state_TRUE_fit<-GenSA(par=params,fn = fn,
lower=lower_limits, upper=upper_limits,
control=list(max.time=100), state = TRUE)
还注意我将state = "TRUE"
更改为state = TRUE
。如果您将其用于逻辑测试,则最好尽可能将其更改为逻辑测试。
如果您想将命名参数传递给函数,则需要提供接受它们的正式参数,因此在fn
参数定义和minim
调用中放入"dots":
minim_state_TRUE_fit<-GenSA(par=params,fn=function(params, ...) {
minim(params[1],params[2], ...) },
lower=lower_limits, upper=upper_limits,
control=list(max.time=100), state="TRUE")