我正在制作一个包含两个 Rcpp 函数的包。第一个函数用于创建一个矩阵,第二个函数将多次使用该矩阵。在调用两个函数之间,矩阵存储在 R 的全局环境中。
M <- myFirstRcpp(X)
P <- mySecondRcpp(M)
Run Code Online (Sandbox Code Playgroud)
根据输入参数,第二个函数将在计算向量之前对输入矩阵(由第一个函数创建)进行更改(aFunction是内部的 C++ mySecondRcpp()):
IntegerVector aFunction( SEXP Qin, SEXP param ) {
NumericMatrix Q(Qin);
// Some changes made to Q
...
// return a vector generated from Q
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,对第二个 Rcpp 函数内的矩阵所做的更改也会影响驻留在 R 全局环境中的Q矩阵 ( ) 的副本。M
如何防止 Rcpp 更改 R 的全局环境而不需要太多开销?
注意:M矩阵的大小约为 2000x65000。Windows 和 Linux 上的 32 位和 64 位 R 中的 R 3.0.2 和 Rcpp 0.10.6 会出现此问题。
这是一个已知且有记录的功能。我们正在通过接口从 R 调用
SEXP somefunction(SEXP a, SEXP b, ...)
Run Code Online (Sandbox Code Playgroud)
因此正在传递一个指针Q并进行更改以影响外部对象。这是一件好事,因为它使调用速度非常快——没有副本。
如果您想要不同的实例,请使用clone()如下方法
NumericMatrix Q = clone(Qin);
Run Code Online (Sandbox Code Playgroud)