我在RcppEigen中写了一些代码,我在documentation中发现了这个不祥的警告:
当然,必须注意不要在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;
}
在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
对于我正在研究的特定问题,我通过修改我的矩阵来提高5倍的速度,所以我已经准备好在可读性和可维护性方面做出小小的牺牲。据我所知,它可以按预期工作,但我担心将来某个时候我会邀请某种微妙的bug。
答案 0 :(得分:9)
如果您仍然了解R 中变量的副作用,那么修改是完全可以的。
在纯粹的功能性世界中,您不需要任何副作用:处理输入而不更改输入,返回结果。
这里我们有一个更混合的方法。对象从R传递为SEXP
,P代表指针---因此更改仍然存在。这让一些人感到困惑,我们有时不得不在这里解释如何避免它。 :)
但总之,你是安全的,特别是如果只是设置元素而不做疯狂的事情,比如改变尺寸等。