2014-01-16 74 views
7

我希望能夠將在R中創建的矩陣存儲在內存中並返回指針。然後使用指針從內存中取回矩陣。我在Ubuntu 13.01和Rcpp版本「0.10.6」上運行R版本3.0.1(2013-05-16) - 「Good Sport」。我曾嘗試...使用xptr在內存中存儲和檢索矩陣

// [[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'對象,可以完成你所描述的內容。 –

+0

它使用XPtr - 請參閱Rcpp Gallery上的有用寫法。 –

回答

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也只是一個身份,並返回外部指針,而不是我想的指針對象你正在尋找。