【问题标题】:Working with subsettable functions and optim()使用子表函数和 optim()
【发布时间】:2015-02-08 22:30:19
【问题描述】:

我有一个关于代码示例的问题:

testfunc<-function(x) {
   f<-x^2
   help.var<- somefunction(f)
   g.grad<- 2* helpvar
   return(c(f,g.grad))
}

当我尝试优化此函数时,例如 optim 希望我提供两个单独的函数,一个函数评估和一个梯度评估。所以,

optim(20,testfunc[1],testfunc[2])   

给出:闭包类型的对象不是可子集的。

我通过定义两个函数来解决这个问题,并将 g.grad 定义为全局变量:

testfunc1<-function(x) {
          f<-x^2
          help.var<<- somefunction(f)

           return(f)
}
help.function<-function(x){
           return(2*help.var)
}
optim(20,testfunc1,help.function)

由于原始问题涉及更多,因此代码很容易混淆。你有什么想法可以更优雅地解决这个问题(也许根本不使用全局变量)?

【问题讨论】:

    标签: r


    【解决方案1】:

    假设您的问题只是如何在一个对象中存储两个函数,那么一种可能的解决方案是

    testfunc <- list(
       f = function(x) x^2,
       g.grad = function(x) 2*x
    )
    

    那你就可以了

    optim(20,testfunc[[1]],testfunc[[2]])
    

    【讨论】:

    • 这绝对是我正在寻找的解决方案。根据您的建议,我注意到我的示例缺少一个重要功能:梯度取决于函数评估。 X^2 可能不是这里最好的例子。
    • 那么为什么你不能在这个解决方案中使用`g.grad = function(x) 2* somefunction(x)`呢?我没有看到问题。由于未定义somefunction,因此您的可重现示例不再可重现,这无济于事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 2011-04-15
    • 1970-01-01
    相关资源
    最近更新 更多