【问题标题】:Saving output from a function.保存函数的输出。
【发布时间】:2013-10-09 15:43:18
【问题描述】:

我正在使用 optim 函数在下面最小化这个函数,它工作得非常好。我唯一的问题是我无法保存 W 矩阵,我在最小化时在函数内部进行计算。有没有办法以某种方式保存 W 矩阵?

W<-c()
GMM_1_stage <- function(beta) {for (i in 1:(nrow(gmm_i))){
  gmm_i[i,]=g_beta(i,beta)}
  gmm_N=t(colSums(gmm_i))%*%colSums(gmm_i) 
  W<-solve((1/(nrow(A)/5))*t(gmm_i)%*%gmm_i) 
  return(gmm_N)
}
GMM_1<-optim(beta_MLE,GMM_1_stage)

最好的问候

【问题讨论】:

    标签: r


    【解决方案1】:

    这是@mrip 答案的更安全版本,它使用临时环境而不是&lt;&lt;-

    tempenv <- new.env()
    tempenv$xx <- c()
    fun<-function(x){
      tempenv$xx[ length(tempenv$xx) + 1 ] <-  x
      x^2    
    }    
    optimize(fun,c(-1,1))
    tempenv$xx
    

    通过使用临时环境,您无需担心意外覆盖全局环境中的对象或&lt;&lt;- 在意外位置分配。

    【讨论】:

      【解决方案2】:

      您可以使用&lt;&lt;- 分配给全局环境(或定义变量的最近祖先环境)中的对象。因此,例如,如果我想在简单优化期间跟踪 x 的每个值,我可以这样做。

      xx<-c()
      fun<-function(x){
        xx[length(xx)+1]<<-x
        x^2    
      }    
      optimize(fun,c(-1,1))
      xx
      ## [1] -2.360680e-01  2.360680e-01  5.278640e-01 -2.775558e-17  4.069010e-05
      ## [6] -4.069010e-05 -2.775558e-17
      

      在您的情况下,如果您只想要 W 的最后一个值,您可以将代码中的该行替换为:

      W<<-solve((1/(nrow(A)/5))*t(gmm_i)%*%gmm_i) 
      

      如果你想要它们,那么首先设置Wlist&lt;-list(),然后在你的函数集中

      Wlist[[length(Wlist)+1]]<<-solve((1/(nrow(A)/5))*t(gmm_i)%*%gmm_i)
      

      【讨论】:

      • 太棒了。这正是我所需要的。非常感谢。
      • @GregSnow 那是什么?
      • @mrip,fortunes 包包含许多代表多年来从各种 R 相关来源收集的机智和智慧的名言,阅读随机财富可能会很有启发性和/或娱乐性。如果你安装了 fortunes 包,加载它,然后运行fortune(174),它会给出一个特定的财富(如果括号是空的,那么它会给出一个随机的财富)。
      • 啊哈。谢谢,不知道。
      猜你喜欢
      • 2016-08-26
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多