使用xptr在内存中存储和检索矩阵

Cur*_*rge 8 c++ r reference matrix rcpp

我希望能够将R中创建的矩阵存储在内存中并返回指针.然后使用指针从内存中取回矩阵.我正在运行R版本3.0.1(2013-05-16) - Ubuntu 13.01上的"Good Sport"和Rcpp版本"0.10.6".我试过了 ...

// [[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))
Run Code Online (Sandbox Code Playgroud)

但是当我再次尝试时,这会失败并且崩溃R.

getMemObject(x)
Error: not compatible with REALSXP
Run Code Online (Sandbox Code Playgroud)

Rom*_*ois 4

您提供给此处的指针XPtr是 本地变量的地址writeMemObject。很自然地,你会有未定义的行为。

另外,外部指针通常用于非 R 对象的事物,而 aNumericMatrix是 R 对象,因此看起来是错误的。

但是,如果由于某种原因你确实想要一个指向 a 的外部指针,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 ;
}
Run Code Online (Sandbox Code Playgroud)

因此创建的指针new超出了函数的作用域writeMemObject

getMemObject另外,请查看您的版本中的更改:

XPtr<NumericMatrix> out(ptr);
return wrap(out);
Run Code Online (Sandbox Code Playgroud)

您没有取消引用指针,wrap只是一个身份并返回外部指针而不是我猜您正在寻找的指针对象。