2014-01-16 4 views
7

Rで作成した行列をメモリに格納してポインタを返すことができるようにしたいと考えています。そして、後でポインタを使用して、メモリから行列を取り戻します。私はRバージョン3.0.1(2013-05-16)を実行しています - Ubuntu 13.01とRcppバージョン "0.10.6"で "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)) 

しかし、私はあなたがXPtrにフィードポインタがここにwriteMemObjectにローカルな変数のアドレスで再び

getMemObject(x) 
Error: not compatible with REALSXP 
+2

これはあなたの質問に答えませんが、あなたは 'bigmemory'パッケージをチェックアウトしましたか?これは、あなたが記述していることをする 'big.matrix'オブジェクトを持っています。 –

+0

それはXPtrを使用しています - Rcppギャラリーで有用な記事を参照してください。 –

答えて

4

をしようとすると、これは失敗し、Rがクラッシュします。当然のことながら、未定義の動作があります。

また、外部ポインタは通常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機能の範囲をoutlives。

また、あなたが持っていたバージョンでは、getMemObjectの変更を参照してください:あなたはポインタを逆参照されていません

XPtr<NumericMatrix> out(ptr); 
return wrap(out); 

wrapはただのアイデンティティも、外部のポインタではなく、私が推測する指示先が返されますあなたが探していた