可以修改RcppEigen中的映射矩阵吗?

pet*_*ete 5 r rcpp

我在RcppEigen中编写了一些代码,我在文档中遇到了这个不祥的警告:

当然,必须注意不要在C++代码中修改R对象的内容.建议的做法是始终将映射对象声明为const.

这指的是"映射"矩阵,即Eigen中使用与相应R对象相同的存储器的矩阵.

这个警告是关于良好的函数式编程实践,还是有其他事情可以出错,如果我使用映射对象进行就地修改?


这是我在Rcpp中所做的简化版本:

#include <RcppEigen.h>
// [[Rcpp::depends(RcppEigen)]]

// [[Rcpp::export]]
void modify(Eigen::Map<Eigen::MatrixXd> X) {

    X(0,0) = 0;
    return;
}
Run Code Online (Sandbox Code Playgroud)

在R中这样的事情是这样的:

X <- matrix(1:4, 2) + 0
X
#      [,1] [,2]
# [1,]    1    3
# [2,]    2    4
modify(X)
X
#      [,1] [,2]
# [1,]    0    3
# [2,]    2    4
Run Code Online (Sandbox Code Playgroud)

对于我正在研究的特定问题,我通过修改我的矩阵来提高5倍的速度,所以我已经准备好在可读性和可维护性方面做出小小的牺牲.据我所知,它可以按预期工作,但我担心将来某个时候我会邀请某种微妙的bug.

Dir*_*tel 9

如果你仍然意识到R中变量的副作用,那么完全可以修改.

在纯粹的功能性世界中,您不需要任何副作用:处理输入而不更改输入,返回结果.

在这里,我们有一个更混合的方法.对象从R传递下来SEXP,而P代表指针---因此更改仍然存在.这让一些人感到困惑,我们有时不得不在这里解释如何避免它.:)

但总之,你是安全的,特别是如果只是设置元素而不做疯狂的事情,如改变尺寸等pp.

  • 幸运的时机.我只是坐下来写一些其他与Rcpp相关的代码,刷新,看到你的问题并试图提供帮助;-) (5认同)