动态增加Rcpp中列表的大小

时间:2013-08-01 10:10:04

标签: r list rcpp

我正在尝试在Rcpp中实现“与过去的耦合”算法。为此,我需要存储一个随机数矩阵,如果算法没有收敛,则创建一个新的随机数矩阵并存储它。这可能需要做10次以上才能收敛。

我希望我可以使用List并动态更新它,就像在R中一样。我实际上非常惊讶它有点工作但是每当列表大小变大时我就会出错。这似乎是有意义的,因为我没有为其他列表元素分配所需的内存,虽然我不熟悉C ++并且不确定这是否是问题。

这是我尝试过的一个例子。但要注意这可能会导致您的R会话崩溃

library("Rcpp")

cppFunction(
includes = ' 
NumericMatrix RandMat(int nrow, int ncol)
 {
  int N = nrow * ncol;
  NumericMatrix Res(nrow,ncol);
  NumericVector Rands  = runif(N);
   for (int i = 0; i < N; i++) 
  {
    Res[i] = Rands[i];
  }
  return(Res);
 }',

code = '
void foo()
{
  // This is the relevant part, I create a list then update it and print the results:
  List x;
  for (int i=0; i<10; i++)  
  {
   x[i] = RandMat(100,10);
   Rf_PrintValue(wrap(x[i]));
  }
}
')


foo()

有没有人知道这样做的方法而不会崩溃R?我想我可以在这里以固定数量的元素启动列表,但在我的应用程序中,元素的数量是随机的。

1 个答案:

答案 0 :(得分:6)

您必须为列表“分配”足够的空间。也许你可以使用类似resize函数的东西:

List resize( const List& x, int n ){
    int oldsize = x.size() ;
    List y(n) ;
    for( int i=0; i<oldsize; i++) y[i] = x[i] ;
    return y ;
}

每当您希望列表比现在更大时,您可以执行以下操作:

x = resize( x, n ) ;

您的初始列表大小为0,因此预计在循环的第一次迭代时会出现不可预测的行为。