我希望能够将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))
但是当我再次尝试时,这会失败并崩溃R
getMemObject(x)
Error: not compatible with REALSXP
答案 0 :(得分: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
只是一个身份并返回外部指针,而不是我想你正在寻找的指针。
答案 1 :(得分:2)
您所描述的几乎是bigmemory包的用例。 Michael Kane写了一篇关于它与Rcpp一起使用的nice Rcpp Gallery article,它可以解决你的问题。