r语言 - NumericMatrix:为什么我可以索引超出它的维度而没有错误?



我有R代码传递一个矩阵()对象到一个Rcpp函数,其参数是NumericMatrix。c++函数给出了正确的维数,但我也可以索引NumericMatrix超出其维数而不会出错。为什么会发生这种情况?下面的MWE(在RStudio中创建的.cpp文件)后面是我看到的一个输出实例,其中第三行显然是(?)从数组边界之外的内存中读取。

#include <RcppArmadillo.h>
using namespace Rcpp;
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
void myFn(Rcpp::NumericMatrix X) {
   std::cout << X.nrow() << std::endl;
   std::cout << X.ncol() << std::endl;
   std::cout << X(100,4) << std::endl;
}
/*** R
# create a matrix to be passed to the C++ function
mat = matrix(3, nrow=10, ncol=3)
myFn(mat)
*/
# 10
# 3
# 3.96421e+252

几个简单的例子:

  1. 您的代码包含RcppArmadillo头文件并设置依赖项,但不使用RcppArmadillo。

  2. 你使用了CRAN和WRE都不赞成的std::cout

  3. 使用.at(i,j)访问器如果你想要边界控制;

修改了下面的例子

#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
void myFn(Rcpp::NumericMatrix X) {
  Rcout << X.nrow() << " " << X.ncol() << std::endl;
  Rcout << X.at(100,4) << std::endl;
}
/*** R
# create a matrix to be passed to the C++ function
mat = matrix(3, nrow=10, ncol=3)
myFn(mat)
*/

如果你运行你想要的错误:

R> Rcpp::sourceCpp("/tmp/indexExample.cpp")
R> # create a matrix to be passed to the C++ function
R> mat = matrix(3, nrow=10, ncol=3)
R> myFn(mat)
10 3
Error in eval(substitute(expr), envir, enclos) (from srcConn#3) : index out of bounds
R> 

相关内容

最新更新