r - 如何保护 R 中的矩阵不被 Rcpp 更改?

标签 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。在 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/

相关文章:

r - dbplyr copy_to 不将表保存到数据库

R:箱线图 - 如何向下移动 x 轴标签?

r - 在Cloudera CDH4上编译R包时GCC出错

c++ - 最小二乘的 SparseQR

r - 如何将 C++ 库中的 exit() 替换为 Rcpp?

r - 消除垂直线ggplot

arrays - 通过对 R 中不同索引求和来矢量化(或加速)双循环

r - 在 Shiny 中下载 react 性对象

c++ - 在 Rcpp 中返回 size_t 的包装

c++ - 我可以在 Armadillo 中实例化矩阵,然后在后面的代码行中将其设置为使用辅助内存吗?