从C 运行代码后解锁绑定(在R中)的问题

Problems with unlocking binding (in R) after running code from c++

本文关键字:问题 绑定 运行 代码 解锁      更新时间:2023-10-16

因此,我将一些代码从R中放入R中,以使我的模型运行速度更快。C 代码返回2个项目的列表:一个称为"跟踪"的向量和一个称为"权重"的矩阵。C 代码运行后,我想将"权重"answers"跟踪"重新分配为从C 代码计算的值。不幸的是,当我尝试执行此操作时,我会遇到错误:"错误:无法更改锁定绑定的'权重'的值"。因此,我搜索了一个解开功能,并发现了解锁点。我将其固定在我的R代码中,但是我仍然遇到与以前相同的错误!我是否将解锁功能放在错误的位置?我是否正确使用它?项目"权重"answers"跟踪"确实存在于全球环境中,所以它们为什么不解锁?

我分配了C 代码返回到变量"结果"的列表,然后我使用了Unlockbinding功能,然后将"权重"answers" Trace"重新分配为C 代码中计算的内容。这是代码:

batch <- function(n.training){ 
  for(i in 1:n.training){
    g <- input.correlation() 
    for(o in 1:nrow(g)){   
      result <- traceUpdate(g[o,], trace, weights, trace.param, learning.rate)  
      unlockBinding("weights", .GlobalEnv)
      unlockBinding("trace", .GlobalEnv)
      weights <<- result$weights
      trace <<- result$trace
    }
  }
}

这是我的C 代码的一部分,它返回了2个项目的列表,一个是矩阵"权重",另一个是向量"跟踪":

List traceUpdate(NumericVector input, NumericVector trace, NumericMatrix weights, double traceParam, double learningRate){
 NumericVector output = forwardPass(input, trace.size(), weights);
 for(int i = 0; i<trace.size(); i++){
   trace[i] = (1 - traceParam) * trace[i] + traceParam * output[i];
   for(int j=0; j<input.size(); j++){
     double w = weights(j,i);
     if(w >= 0){
       weights(j,i) = w + learningRate * trace[i] * input[j] - learningRate * trace[i] * w;  
     }
   }
 }
 //return weights
 return List::create(Rcpp::Named("weights") = weights,
                     Rcpp::Named("trace") = trace);

}

如果我只是重新分配这样的权重: 权重&lt; - 矩阵(0,nrow = 100,ncol = 20)他们全部更改为零,我没有错误。

另外,在网上寻找解决方案时,我遇到了一种在R中解锁环境的方法,但我很确定这不是问题,因为环境没有锁定。

我是这个网站的新手,对编程的新手,因此,如果我的问题是愚蠢或格式不正确的。

,我深表歉意。

谢谢。

刚从我的教授那里收到了解决方案:

"而不是将权重和跟踪视为从批处理功能内部修改的全局变量,我们可以将它们传递到功能中并将其返回:"

batch <- function(weights, trace, n.training){ 
  for(i in 1:n.training){
    g <- input.correlation() 
    for(o in 1:nrow(g)){   
      result <- traceUpdate(g[o,], trace, weights, trace.param, learning.rate)
      weights <- result$weights
      trace <- result$trace
    }
  }
  return(list(weights=weights, trace=trace))
}
result <- batch(weights, trace, 50)
weights <- result$weights
trace <- result$trace