我正在制作一个包含两个Rcpp函数的包。第一个函数用于创建将由第二个函数多次使用的矩阵。矩阵存储在R的全局环境中,在两个函数的调用之间。
M <- myFirstRcpp(X)
P <- mySecondRcpp(M)
根据输入参数,第二个函数在从中计算向量之前将对输入矩阵(由第一个函数创建)进行更改(aFunction
是mySecondRcpp()
内的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会出现问题。
答案 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()
。