我正在制作一个包含两个 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。在 32 位和 64 位 R 的 Windows 和 Linux 上,R 3.0.2 和 Rcpp 0.10.6 会出现此问题。
最佳答案
这是一个已知且有记录的功能。我们正在通过接口(interface)从 R 调用
SEXP somefunction(SEXP a, SEXP b, ...)
因此传递了一个指针,并且对Q
的更改会影响外部对象。 这是一件好事,因为它使调用速度非常快——没有副本。
如果您想要不同的实例,请使用 clone()
方法,如
NumericMatrix Q = clone(Qin);
关于r - 如何保护 R 中的矩阵不被 Rcpp 更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21281911/