我希望能够将在 R 中创建的矩阵存储在内存中并返回指针。然后稍后使用指针从内存中取回矩阵。我在 Ubuntu 13.01 和 Rcpp 版本“0.10.6”上运行 R 版本 3.0.1 (2013-05-16)——“Good Sport”。我试过了...
// [[Rcpp::export]]
SEXP writeMemObject(NumericMatrix mat)
{
XPtr<NumericMatrix> ptr(&mat, true);
return ptr;
}
// [[Rcpp::export]]
NumericMatrix getMemObject(SEXP ptr)
{
XPtr<NumericMatrix> out(ptr);
return wrap(out);
}
# This returns a pointer
x <- writeMemObject(matrix(1.0))
但是当我再次尝试时,这失败并使 R 崩溃
getMemObject(x)
Error: not compatible with REALSXP
最佳答案
此处您提供给XPtr
的指针是writeMemObject
本地变量的地址。很自然地,您有未定义的行为。
此外,外部指针通常用于非 R 对象的事物,而 NumericMatrix
是一个 R 对象,因此看起来不对。
但是,如果出于某种原因你真的想要一个指向 NumericMatrix
的外部指针,那么你可以这样做:
#include <Rcpp.h>
using namespace Rcpp ;
// [[Rcpp::export]]
SEXP writeMemObject(NumericMatrix mat){
XPtr<NumericMatrix> ptr( new NumericMatrix(mat), true);
return ptr;
}
// [[Rcpp::export]]
NumericMatrix getMemObject(SEXP ptr){
XPtr<NumericMatrix> out(ptr);
return *out ;
}
因此 new
创建的指针超出了 writeMemObject
函数的范围。
此外,请查看 getMemObject
中的更改,在您的版本中:
XPtr<NumericMatrix> out(ptr);
return wrap(out);
您没有取消引用指针,wrap
只是一个身份并返回外部指针,而不是我猜您正在寻找的指针。
关于c++ - 使用 xptr 在内存中存储和检索矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21154003/