如何保护R中的矩阵不被Rcpp改变?

时间:2014-01-22 11:40:39

标签: r rcpp

我正在制作一个包含两个Rcpp函数的包。第一个函数用于创建将由第二个函数多次使用的矩阵。矩阵存储在R的全局环境中,在两个函数的调用之间。

M <- myFirstRcpp(X)
P <- mySecondRcpp(M)

根据输入参数,第二个函数在从中计算向量之前将对输入矩阵(由第一个函数创建)进行更改(aFunctionmySecondRcpp()内的C ++):

IntegerVector aFunction( SEXP Qin, SEXP param ) {
    NumericMatrix Q(Qin);
    // Some changes made to Q
    ...
    // return a vector generated from Q
}

我的问题是第二个Rcpp函数中对Q矩阵所做的更改也会影响驻留在R全局环境中的矩阵(M)的副本。

如何避免Rcpp在没有太多开销的情况下改变R的全局环境?

注意:M矩阵的大小约为2000x65000。在Windows和Linux上,在32和64位R中,R 3.0.2和Rcpp 0.10.6会出现问题。

2 个答案:

答案 0 :(得分:4)

这是一个已知的记录功能。我们通过界面从R调用

  SEXP somefunction(SEXP a, SEXP b, ...)

所以正在传递指针,对Q的更改会影响外部对象。 这是一件好事,因为它使调用非常快 - 没有副本。

如果您需要不同的实例,请使用

中的clone()方法
  NumericMatrix Q = clone(Qin);

答案 1 :(得分:0)

您可以在R中执行的另一项操作(例如,当您无法轻松编辑Rcpp代码时)是在R对象引用上调用[方法。这迫使R传递副本。例如,

M <- myFirstRcpp(X)
P <- mySecondRcpp(M[])`

现在,M的副作用不会改变mySecondRcpp()