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

8

我希望能够在R中将一个矩阵存储到内存中并返回指针,然后稍后再使用该指针从内存中获取矩阵。我的R版本是3.0.1(2013-05-16)——“Good Sport”,Ubuntu 13.01和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))

但是当我再次尝试时,这个过程失败并导致R崩溃。
getMemObject(x)
Error: not compatible with REALSXP

2
这并不是回答你的问题,但是你有没有看过 bigmemory 包?它有一个 big.matrix 对象可以实现你所描述的功能。 - Scott Ritchie
它使用XPtr - 请参阅Rcpp Gallery中有用的文章。 - Dirk Eddelbuettel
2个回答

4
在这里提供给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只是一个标识符,会返回外部指针而不是您想要的指向对象的指针。

3
你所描述的基本上是bigmemory包的使用情况。Michael Kane撰写了一篇关于Rcpp的优秀文章,讲述了它与Rcpp的使用,应该能解答你的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接